RSA算法和RSA数字签名算法的实现
RSA加密算法_源代码__C语言实现

RSA算法
1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。
RSA的安全性依赖于大数难于分解这一特点。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
} b--; //c=a * c % n; //这里也会溢出,若把64位整数拆为两个32位整数不知是否可以解决这个问题。
c=MulMod(a, c, n);
} return c;
}/*
Rabin-Miller素数测试,通过测试返回1,否则返回0。
n是待测素数。
注意:通过测试并不一定就是素数,非素数通过测试的概率是1/4
5,
7,
11,
13,
17,
19,
23,
29,
RSA加密算法原理及RES签名算法简介

RSA加密算法原理及RES签名算法简介第⼀部分:RSA原理与加密解密⼀、RSA加密过程简述A和B进⾏加密通信时,B⾸先要⽣成⼀对密钥。
⼀个是公钥,给A,B⾃⼰持有私钥。
A使⽤B的公钥加密要加密发送的内容,然后B在通过⾃⼰的私钥解密内容。
⼆、RSA加密算法基础整个RSA加密算法的安全性基于⼤数不能分解质因数。
三、数学原理(⼀) 互质关系:两个数a和b没有除1外的其他公约数,则a与b互质1. 任意两个质数构成互质关系2. 两个数中,如果⼤数为质数,则两数必定互质3. 1和任意整数互质4. 当p>1时,p与p-1互质(相邻两数互质)5. 当p=2n+1(n>0且n为整数)时,p与p+2互质(相连的两个奇数互质)(⼆) 求欧拉函数:定义:与正整数n互质且⼩于正整数n的正整数的个数。
通常使⽤ψ(n)表⽰。
求取与正整数n互质的正整数的个数ψ(n),且ψ(n)满⾜ψ(n)∈(2,n)1. 如果n=1,则ψ(n)=12. 如果n是质数,则ψ(n)=n-13. 如果n是质数p的次⽅,则:ψ(p^k)=p^k-p^(k-1) = p^k*(1-1/p)4. 若p1和p2互质,n=p1*p2,则ψ(n)= ψ(p1*p2)= ψ(p1) ψ(p2)5. 任意⼀个⼤于1的正整数都可以写成⼀系列质数的积6. 根据定理5,推导欧拉定理:因为n = (p1^k1)* (p2^k2)*……(pr^kr) (p1~pr都是质数)所以ψ(n)= ψ((p1^k1)) ψ(p2^k2) ……ψ(pr^kr) 定理4ψ(n)= (p1^k1)*(1-1/p1) * (p2^k2)(1-1/p2)……(pr^kr)*(1-1/pr) 定理3ψ(n)= (p1^k1)* (p2^k2)*……(pr^kr) * (1-1/p1) (1-1/p2)…… (1-1/pr)ψ(n)=n (1-1/p1) (1-1/p2)…… (1-1/pr)(三) 欧拉定理:正整数a与n互质,则下式恒成⽴a^ψ(n) ≡1(mod n)即:a的ψ(n)次幂除以n,余数恒为1(四) 模反元素如果两个正整数a和n互质,则必定存在整数b使得a*b-1被n除余数为1ab ≡1(mod n)其中b被称为a的模反元素四、RSA算法详解:假设A和B要通信(⼀) ⽣成密钥1. 公钥1) 随机⽣成两个不相等的质数p和q(质数越⼤越安全)2) 计算n,n=p*q 则n的⼆进制位数就是密钥的长度。
5基于RSA算法的数字签名的实现

5 基于RSA算法的数字签名的实现5.1开发环境介绍以其强大的性能,世界级的工具支持,操作简易性,扩展性,安全性等等优点,迅速的风靡全球,随着使用者的越来越多,数字签名的问题就越来越受关注。
C# 是.NET的关键性语言,它整个.NET平台是的基础。
5.1.1 C#语言概述在过去的20年里,C和C++已经成为在商业软件的开发领域中使用最广泛的语言。
他们为程序员提供了十分灵活的操作,不过同时也牺牲了一定的效率。
与诸如Microsoft V isual Basic等语言相比,同等级别的C/C++应用程序往往需要更长时间来开发。
由于C/C++语言的复杂性,许多程序员都试图寻找一种新的语言,希望能在功能与效率之间找到一个更为理想的平衡点。
对于C/C++用户来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。
他们想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。
另外,一些C/C++开发人员还需要在必要的时候进行一些底层的编程。
C#是微软对这一问题的解决方案。
C#是一种最新的,面向对象的编程语言,他使得程序员可以快速地编写各种基于平台的应用程序。
提供了一系列的工具和服务来最大程度地开发利用计算与通信领域。
正是由于C#面向对象的卓越设计,使他成为构建各类组件的理想之选,无论是高级的商业对象还是系统级的应用程序,使用简单的C#语言结构,这些组件可以方便地转化为XML 网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用。
最重要的是,C#使得C++程序员可以高效地开发程序,而绝不损失C/C++原有的强大功能。
因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快地转向C#。
5.1.2C#语言的特点C#语言自C/C++演变而来,它是给那些愿意牺牲C++一点底层功能,以获得更方便和更产品化的企业开发人员而创造的。
C#主要特点:简洁、与Web紧密结合、完全面向对象、强壮安全、灵活性和兼容性。
数字签名算法-RSA、DSA、ECDSA、ECDH

数字签名算法-RSA、DSA、ECDSA、ECDH数字签名算法介绍和区别原⽂阅读:数字签名是⼀个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,⽤于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。
也是⾮对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本⽂对数字签名算法进⾏详细介绍。
Hash⼜译散列、摘要等名,本⽂统⼀称Hash。
1. RSA数字签名算法RSA是⽬前计算机密码学中最经典算法,也是⽬前为⽌使⽤最⼴泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是⼀样的,算法的名称都叫RSA。
密钥的产⽣和转换都是⼀样的,包括在售的所有SSL数字证书、代码签名证书、⽂档签名以及邮件签名⼤多都采⽤RSA算法进⾏加密。
RSA数字签名算法主要包括MD和SHA两种算法,例如我们熟知的MD5和SHA-256即是这两种算法中的⼀类,具体如下表格分布1.1. MD2、MD4、MD5算法最常见的是我们熟知的MD5加密算法,MD5全称Message-Digest Algorithm 5(信息-摘要算法 5),⽬前⽐较普遍的Hash算法,是散列算法的基础原理,MD5的前⾝有MD2、MD3和MD4。
MD5算法法是输⼊任意长度字符,输出固定长度128位的算法。
经过程序流程,⽣成四个32位数据,最后联合起来成为⼀个128位Hash值,主要⽅式是通过求余、取余、调整长度、与链接变量进⾏循环运算进⽽得出结果。
1.2. SHA-1算法SHA-1是由NIST NSA设计为同DSA⼀起使⽤的,SHA-1设计时基于和MD4相同原理,并且模仿了该算法,SHA-1抗穷举(brute-force)性更好,它产出160位的Hash值,对于⾮线性运算、移位和加法运算也与MD5类似。
SHA-1也应⽤于包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多种协议中,曾被视为是MD5的后继者。
数字签名算法实验报告

竭诚为您提供优质文档/双击可除数字签名算法实验报告篇一:数字签名实验报告附件2:北京理工大学珠海学院实验报告ZhuhAIcAmpAusoFbeIJIngInsTITuTeoFTechnoLogY实验题目数字签名实验实验时间20XX.4.8一、实验目的:(1)掌握数字签名技术的原理;(2)熟悉密钥的生成及其应用。
二、实验内容以及步骤:RsA-pKcs签名算法(一)签名及验证计算(1)进入实验实施,默认选择即为“RsA-pKcs”标签,显示RsA-pKcs签名实验界面。
(2)选择明文格式,输入明文信息。
点击“计算shA1值”按钮,生成明文信息的散列值。
(3)选择密钥长度,此处以512bit为例,点击“生成密钥对”按钮,生成密钥对和参数。
选择“标准方法”标签,在标签下查看生成的密钥对和参数。
(4)标准方法签名及验证点击“标准方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果;上述过程如图1.1.8-3所示。
(5)选择“中国剩余定理方法”标签,在标签下查看生成的密钥对和参数。
(6)中国剩余定理方法签名及验证点击“中国剩余定理方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果。
eLgAmAL签名算法(1)在“RsA-pKcs”标签下的扩展实验中,点击“eLgAmAL 扩展实验”按钮,进入eLgAmAL签名算法扩展实验窗体。
(2)设置签名系统参数。
在文本框“大素数p”内输入一个大的十进制素数(不要超过8位);然后在文本框“本原元a”内输入一个小于p的十进制正整数,点击“测试”。
(3)注册用户,在“用户名”文本框中输入一个“注册用户列表”中未出现的用户名,如“alice”,点击“注册”按钮。
(4)在“用户注册”窗口中的文本框“私钥x”中输入一个小于素数p的十进制非负整数,点击“确定”按钮;然后,点击“计算公钥”按钮,系统会为该用户生成一对公私钥。
证书的签名算法

证书的签名算法在数字证书中,签名算法是一种用于验证证书的真实性和完整性的重要工具。
签名算法通过对证书进行加密和验证,确保证书的发送者和内容未被篡改,同时也确保了证书的信任和可靠性。
本文将介绍几种常见的证书签名算法,它们在保护证书安全方面发挥了至关重要的作用。
一、RSA签名算法RSA签名算法,是使用公钥密码体制中的非对称加密算法。
该算法基于大数分解的困难性,通过生成两个大素数,并根据私钥对其中一个素数进行选择,然后根据公钥对两个素数相乘得到的数字进行加密,形成数字签名。
RSA算法的优势在于其安全性较高,同时也具备较好的效率。
然而,随着计算机计算能力的不断提高,破解RSA密钥将变得更加容易。
因此,在实际应用中,通常会使用更为安全的签名算法。
二、ECDSA签名算法ECDSA签名算法,全称椭圆曲线数字签名算法,在椭圆曲线密码体制中被广泛应用。
该算法基于椭圆曲线离散对数难题的困难性,使用非对称加密的方式生成数字签名。
与RSA相比,ECDSA算法在相同的安全性条件下,所需的密钥长度更短,计算速度更快。
同时,该算法也能够提供与RSA相当的安全性,确保被签名证书的完整性和真实性。
三、DSA签名算法DSA签名算法,全称数字签名算法,是一种常用的非对称加密算法。
该算法基于离散对数的困难性,使用私钥对要签名的消息进行加密,生成数字签名。
DSA算法主要应用于数字签名和密钥交换等领域,在保证通信安全方面发挥了重要作用。
然而,DSA算法的密钥长度相对较长,计算速度相对较慢,所以在实际应用中,通常会结合其他算法使用。
四、EdDSA签名算法EdDSA签名算法,全称Edwards-curve Digital Signature Algorithm,是一种基于椭圆曲线密码体制的签名算法。
该算法基于扭曲爱德华曲线上的离散对数问题,提供了一种高效且安全的签名方案。
相较于传统的签名算法,EdDSA算法的计算效率更高,且密钥长度相对较短,提供了更高的安全性。
RSA加密算法及实现

RSA加密算法及实现RSA加密算法是一种非对称加密算法,广泛应用于网络通信中的数据加密和数字签名等方面。
RSA算法的核心思想是基于大数分解的难解性问题,通过数论中的数学原理实现加密过程。
下面将详细介绍RSA加密算法的原理和实现。
RSA算法的原理如下:1.密钥的生成:-随机选择两个不同的大质数p和q。
-计算n=p*q。
-计算欧拉函数φ(n)=(p-1)*(q-1)。
-选择一个整数e,使得1<e<φ(n),且e与φ(n)互质。
- 计算e关于φ(n)的模反元素d,使得d * e ≡ 1 (modφ(n))。
-公钥为(n,e),私钥为(n,d)。
2.加密算法:-将明文m转化为整数。
- 计算密文c = m^e mod n。
3.解密算法:- 计算明文m = c^d mod n。
1.密钥的生成:首先,使用一个大数库来生成大质数p和q,确保p和q均为质数。
然后,计算n=p*q,并计算φ(n)=(p-1)*(q-1)。
选择一个合适的e,可以是小于φ(n)的质数或者与φ(n)互质的数。
使用扩展欧几里德算法,计算e关于φ(n)的模反元素d。
最终得到公钥为(n,e),私钥为(n,d)。
2.加密算法:将明文m转化为整数。
然后,使用快速模幂算法计算密文c = m^e mod n。
3.解密算法:使用快速模幂算法,计算明文m = c^d mod n。
需要注意的是,RSA算法对加密和解密的数据长度有限制,一般建议将要加密的数据分块进行加密。
同时,为了增强安全性,一般会使用大的素数来生成密钥。
总结:RSA加密算法是一种非对称加密算法,通过数论中的数学原理实现加密过程。
它的核心思想是基于大数分解的难解性问题。
RSA算法的实现需要生成密钥对、加密和解密三个步骤。
密钥的生成需要随机选择两个大质数,并进行相应的计算。
加密算法通过快速模幂算法进行加密,解密算法也通过快速模幂算法进行解密。
RSA算法在实际应用中广泛用于保护数据的机密性和完整性,同时也是数字签名等功能实现的基础。
数字签名系统实验报告

一、实验目的1. 理解数字签名的概念和原理;2. 掌握数字签名算法的设计与实现;3. 了解数字签名在信息安全中的应用。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C#三、实验内容1. 数字签名算法的选择与设计本实验选用RSA算法作为数字签名算法,RSA算法是一种非对称加密算法,具有较好的安全性。
2. 数字签名算法的实现(1)RSA密钥对的生成RSA算法首先需要生成一对密钥,包括公钥和私钥。
公钥用于加密和解密,私钥用于签名和验证签名。
(2)数字签名生成使用公钥对数据进行加密,得到数字签名。
数字签名是对原始数据的加密,只有使用对应的私钥才能解密。
(3)数字签名验证使用公钥对数字签名进行解密,得到解密后的数据。
将解密后的数据与原始数据进行比较,若一致,则验证成功。
3. 数字签名系统设计(1)系统架构数字签名系统采用分层架构,包括以下层次:- 应用层:负责用户交互、数据处理和存储;- 业务逻辑层:负责数字签名算法的实现;- 数据访问层:负责数据存储和读取。
(2)功能模块- 用户注册与登录:用户注册账号,登录系统;- 数据上传与下载:用户上传待签名的数据,系统生成数字签名,用户下载签名后的数据;- 数字签名验证:用户上传签名后的数据,系统验证签名是否有效。
四、实验步骤1. 创建RSA密钥对在Visual Studio 2019中,使用C#语言创建RSA密钥对。
2. 实现数字签名算法(1)生成数字签名使用公钥对原始数据进行加密,得到数字签名。
(2)验证数字签名使用公钥对数字签名进行解密,得到解密后的数据,并与原始数据进行比较。
3. 设计数字签名系统(1)创建系统架构根据系统需求,设计系统架构。
(2)实现功能模块编写代码实现用户注册、登录、数据上传、下载、签名生成、签名验证等功能。
五、实验结果与分析1. 实验结果本实验成功实现了数字签名系统,用户可以上传待签名的数据,系统生成数字签名,用户可以下载签名后的数据,并对签名进行验证。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RSA算法和RSA数字签名算法的实现
RSA算法和RSA数字签名算法的实现
摘要 RSA算法是一种公钥密码算法.实现RSA算法包括生成RSA密钥,
用RSA加密规则和解密规则处理数据。
RSA数字签名算法利用RSA算法实现数字签名。
本文详述了RSA算法的基本原理, RSA加密算法的实现以及如何利用RSA实现数字签名.
关键字 RSA算法, 数字签名, 公开密钥, 私人密钥, 加密, 解密
中图分类号 TP301
一、引言
随着网络技术的飞速发展,信息安全性已成为亟待解决的问题。
公钥密码体制中,解密和加密密钥不同,解密和加密可分离,通信双方无须事先交换密钥就可建立起保密通信,较好地解决了传统密码体制在网络通信中出现的问题。
另外,随着电子商务的发展,网络上资金的电子交换日益频繁,如何防止信息的伪造和欺骗也成为非常重要的问题。
数字签名可以起到身份认证、核准数据完整性的作用。
目前关于数字签名的研究主要集中基于公钥密码体制的数字签名。
公钥密码体制的特点是:为每个用户产生一对密钥(PK和SK);PK公开,SK保密;从PK推出SK是很困难的;A、B双方通信时,A通过任何途径取得B的公钥,用B的公钥加密信息。
加密后的信息可通过任何不安全信道发送。
B收到密文信息后,用自己私钥解密恢复出明文。
公钥密码体制已成为确保信息的安全性的关键技术。
RSA公钥密码体制到目前为止还是一种认可为安全的体制。
本文详述了RSA算法和用RSA算法实现数字签名的理论,以及它们在实际应用中的实现。
二、RSA算法和RSA数字签名算法的理论描述
1 RSA算法
RSA算法的理论基础是一种特殊的可逆模幂运算。
设n是两个不同奇素数p和q的积,即:n=pq, ϕ(n)=(p-1)(q-1)。
定义密钥空间 k={(n,p,q,d,e)|n=pq,p和q是素数,de≡1 mod ϕ(n),e 为随机整数},
对每一个k=(n,p,q,d,e),
定义加密变换为E k(x)=x b mod n,x∈Z n;
解密变换为D k(x)=y a mod n,y∈Z n,Z n为整数集合。
公开n和b,保密p,q和a.
为证明加密变换E k和解密变换 D k满足D k(E k(x))=x,这里不加证明的引用下面两个定理:
定理1(Euler)对任意的a∈Z
n
*,有aϕ(n)≡1 mod n,其中
Z
n *={x∈Z
n
|gcd(x,n)=1},ϕ(·)表示Euler函数。
定理2 设p和q是两个不同的素数,n=pq, ϕ(n)=(p-1)(q-1),对任意的x∈Z
n 及任意的非负整数k,有 x kϕ(n)+1≡x mod n.
现在来证明RSA算法的加密变换和解密变换的正确性。
证明:对于加密变换E k和解密变换D k。
因为ab≡1 mod ϕ(n),所以可设
ab=tϕ(n)+1,t是整数且t≥1。
对于任意的x∈Z
n
,有D k(E k(x))≡D k(x b) ≡(x b)a≡x tϕ(n)+1≡x mod n.因此解密过程是正确的。
2 RSA数字签名算法
RSA数字签名算法的过程为:A对明文m用解密变换作: s≡D k(m)=m d mod n,其中d,n为A的私人密钥,只有A才知道它;B收到A的签名后,用A的公钥和加密变换得到明文,因:E k(s)=E k(D k(m))= (m d)e mod n,又 de≡1 mod ϕ(n)即de=lϕ(n)+1,根据欧拉定理mϕ(n)=1 mod n,所以E k(s)=m lϕ(n)+1=[mϕ(n)]e m=m mod n。
若明文m和签名s一起送给用户B,B可以确信信息确实是A发送的。
同时A也不能否认送给这个信息,因为除了A本人外,其他任何人都无法由明文m 产生s.因此RSA数字签名方案是可行的。
但是RSA数字签名算法存在着因计算方法本身同构造成签名易被伪造和计算时间长的弱点,因此实际对文件签名前,需要对消息做MD5变换。
MD5函数是一种单向散列函数,它将任意长度的消息压缩成128位的消息摘要。
应用MD5的单向性(即给定散列值,计算消息很难)和抗碰撞性(即给定消息M,要找到另一消息M’并满足两者的散列值很难),可以实现信息的完整性检验。
另外该函数的设计不基于任何假设和密码体制而直接构造,执行的速度快,是一种被广泛认可的单向散列算法。
三、RSA算法的实现
RSA算法的实现分为:生成密钥,加密,解密。
1 数据结构
RSA密码系统的安全性依赖于大数分解的难度,一般建议用户选择的素数p和q至少为100位,则n=pq是至少为200位的十进制数。
因此实现RSA算法有必要定义大数的数据结构如图一所示。
密钥生成,加密和解密涉及到一些大数的基本运算。
定义大数的基本运算库,包括加、减、乘、除、取模运算等,其中最重要的模乘运算和模幂运算。
模幂算法是加密解密的核心算法。
计算模幂的一种有效算法是“平方-乘”方法,通过对指数的二进制化来实现。
8
过程如图1:
Procedure modmult
begin typedef struct
{
unsigned long int bn[MAX_LENGTH];
unsigned int size; }BigNum
图2大数的数据结构
Z=1 for i=l-1 downto 0 do: begin Z=Z 2 mod n; if b i =1 then Z=Z*x mod n; end end 图一 2 密钥的生成 2.1 RSA 公钥和私钥的结构定义
根据文档PKCS#1定义RSA 公钥和私钥分别如图2和图3。
理论上讲,RSA 私钥只需包括解密模数和解密指数。
但是为加快RSA 解密计算的效率,采用中国剩余定理算法,因此RSA 私钥包含
p,q,d mod (p-1),d mod (q-1),q -1 mod p,其中p,q 为大素数, d mod (p-1), d
mod (q-1),q -1 mod p 由计算过程生成。
2.2 生成密钥步骤
生成RSA 密钥需完成下列步骤: (1) 选择e 的值为3或者25537; (2) 随机生成大素数p ,直到gcd (e,p-1)=1; 其中gcd(a,b)表示a,b 取最大公约数 (3) 随机生成不同于p 的大素数q ,直到 gcd (e,q-1)=1; (4) 计算n=pq , ϕ(n)=(p-1)(q-1); (5) 计算d,满足de ≡1 (mod ϕ(n)); (6) 计算 d mod (p-1), d mod (q-1); (7) 计算q -1 mod p; (8) 将n,e 放入RSA 公钥;将n,e,d mod (p-1),d mod (q-1) q -1 mod p 放入RSA 私钥。
随机素数的产生可分为两个模块: 2.2.1 随机数的产生
随机数不仅用于密钥生成,也用作公钥加密时的填充字符。
它必须具有足
够的随机性,以防止破译者掌握随机数的规律性后重现密钥的配制过程或者探
测到加密块中的明文。
因为在计算机上不可能产生真正的随机数,实际采用周
期大于2256位的伪随机序列发生器。
实现过程为:
(1) 记录相邻两次敲击键盘的时间间隔,直到不再需要随机事件。
(2) 做MD5计算,直到不再需要伪随机数。
[3]Burt Kaliski, Rfc 2313, PKCS#1。