类型:课程设计题目:数字加密技术研究与分析目录摘要............................................... 错误!未定义书签。
ABSTRACT ........................................... 错误!未定义书签。
目录 (2)第一章RSA公钥密码简介 (4)1.1公开密钥密码系统 (4)1.2RSA加密算法 (5)1.3RSA公钥密码的安全 (8)第二章RSA加密算法的有关数学知识 (10)2.1数论 (10)2.1.1 模运算 (10)2.1.2素数 (10)2.1.3最大公因子 (12)2.1.4幂模运算 (14)2.1.5 乘法逆元 (16)2.2RSA中重要定理 (18)2.2.1 费马定理 (18)2.2.2 欧拉定理 (19)2.2.3 欧几里德算法 (22)第三章 MD5算法简介 (27)3.1MD5算法的发展史 (27)3.2MD5算法的应用 (28)3.3MD5算法描述 (29)3.3.1 MD5算法的步骤 (29)3.3.2 MD5的压缩函数 (36)3.4 MD5算法的安全 (41)第四章 MD5算法在RSA算法中应用 (42)4.1RSA算法加密文件 (42)4.1.1 加密过程 (42)4.1.2 解密过程 (43)4.2文件的信息摘要 (46)4.3MD5算法在RSA算法中的应用 (47)4.4补充说明 (48)第一章RSA公钥密码简介1.1 公开密钥密码系统一个好的加密算法的重要特点之一是具有这种能力:可以指定一个密码或密钥,并用它来加密明文,不同的密码或密钥产生不同的密文。
这又分为两种方式:对称密钥算法和非对称密钥算法。
所谓对称密钥算法就是加密解密都使用相同的密钥,非对称密钥算法就是加密解密使用不同的密钥。
非常著名的pgp公钥加密以及RSA加密方法都是非对称加密算法。
加密密钥,即公钥,与解密密钥,即私钥,是非常的不同的。
从数学理论上讲,几乎没有真正不可逆的算法存在。
公钥密码又称为双钥密码和非对称密码,是1976年由Diffie和Hellman在其“密码学新方向”一文中提出的。
他是用一个密钥进行加密,而用另一个不同但是有关的密钥进行解密。
图1.1.1给出了公开密钥加密过程。
其中重要步骤如下:1)网络中的每个端系统都产生一对用于它将接收的报文进行加密和解密的密钥。
2)每个系统都通过把自己的加密密钥放进一个登记或者文件来公布告它,这就是公开密钥。
另一个密钥则是私有的。
3)如果A想给B发送一个报瘪他就用B的公开密钥加密这个报文。
4)B收到这个报文后就用他的保密密钥解密报文。
其他所有收到这个报文的人都无法解密它,因为只有B才有B的私有密钥。
图1.1.1 加密过程非对称密钥算法RSA算法于1977年由美国麻省理工学院MIT(Messachusetts Institute of Technology)的Ronal Rivest ,Adi Shamir 和Len Adleman三位年轻教授提出,并以三人的姓氏Rivest ,shamir 和Adlernan命名为RSA算法。
该算法利用了数论领域的一个事实,那就是虽然把两大质数相乘生成一个合数是件十分容易的事情,但是把一个合数分解为两个质数却十分困难。
合数分解问题目前仍然是数学领域尚未解决的一大难题,至今没有任何高效的分解方法。
RSA算法无须收发双方同时参与加密过程,且非常适合于电子函数系统的加密。
1.2 RSA加密算法RSA算法可以表述如下:(1)密钥配制。
假设m是想要传送的报文,现任选两个很大的质数p与q,ϕ=-⨯-互质,且e 小于使得:选择正整数e,使得e 与()(1)(1)n p qϕ=-⨯-;再利用相除法,求得d,使得到:n p q()(1)(1)≡ed n1(mod)这里表示n=q*p,其中x mod y是整数求模运算,其结果是x整除以y 后剩余的余数,如果5 mod 3 =2。
所以密钥是:(e,n),是用于加密的公共密钥,可以公开出去;而(d,n)是用于解密的专用钥匙,必须保密。
用VC++求的RSA加密解密参数和密钥是:结果分析是:由上图得知,公钥是{931, 1067}, 私钥是{331,1067}。
(2)加密过程。
使用(e,n)对明文m进行加密得到密文c,算法为:c =m e mod n.加密结果为:使明文变成了不能读的密文。
(3)解密过程。
使用(d,n)对密文c进行解密,算法为:m = c e mod n求得的m是对应于密文c的明文。
解密结果为:解密的结果是使密文变成原文。
RSA 公共密钥加密算法的核心是欧拉(Euler)函数()n ϕ。
对于正整数n, ()n ϕ定义为小于n 且与n 互素的正整数的个数。
例如(6)ϕ=2,这是因为小于6且与6互素的数有1和5共两个数。
欧拉定义有两个重要性质:性质1: 如果p 是质数,则:()1p p ϕ=-性质2: 如果p 与q 均为互质数,则:()(1)(1)p q p q ϕ⨯=-⨯-RSA 算法正是注意到这两条性质设计公共密钥系统的,p 与 q 的乘积n可以说作为公共密钥公布出来,而n 的因子p 与q 则包在专用密钥中,可以用来解密。
如果解密需要用到()n ϕ接收方由于知道因子p 和q ,可以方便地算出:()(1)(1)n p q ϕ=-⨯-如果窃听得了n ,但由于不知道它的因子p 与q ,则很难求出()n ϕ。
这时,窃听者要么强行算出()n ϕ,要么对n 进行因数分解求得p 与q 。
然而,我们知道,在大数范围内作合数分解是十分困难的,困此窃听者很难成功。
1.3 RSA公钥密码的安全RSA的安全性完全依赖于大数分解问题只是一个推测,目前,还未能从理论上证明由c和e计算出m一定需要分解n。
还不能证明对RSA攻击的难度和ϕ分解n的难度相当,但也没有比因式分解n更好的攻击方法。
已知n,求得()n (ϕ的欧拉函数),则p和q可以求得。
因为根据欧拉定理:ϕ=-⨯-()(1)(1)n p q=⨯-++()1p q p q22-=+-⨯⨯p q p q p q()()4据此列出方程,求得p和q。
然而,如果新方法能使密码分析者推算出d,它也就成为大数分解的一个新方法。
ϕ=-⨯-的值,可以攻击RSA,但这种方法并不比分解n 通过猜测()(1)(1)n p q容易。
分解n是最显而易见的攻击方法。
敌方手中有公钥e和模n,要得到解密密d,他就要分解n。
目前,129位长的数也被分解,因此,n应大于这些数。
目前,已有人在用1024bit(308位)n 值的RSA。
一个密码分析者完全可能去尝试每一个可能的d 值,直到碰上一个正确的为止。
这种“蛮力”攻击甚至不如尝试分解n有效。
为安全起见,对p和q要求:p和q的相差不大;(p-1)和(q-1)有大素数因子;gcd(p-1,q-1)很小,满足这样条件的素数称做安全素数。
RSA的出现使得大整数分解因式这一古老的问题再次被重视,近些年来出现的不少比较高级的因数分解方法使“安全素数”的概念也在不停的演化。
所以,选择传统上认为是“安全素数”并不一定有效的增加安全性,比较保险的方法就是选择足够大的素数。
因为一个数越大,对其分解因式的难度也就越大!对n和密钥长度的选择取决于用户保密的需要。
密钥长度越大,安全性也就越高,但是相应的计算速度也就越慢。
由于高速计算机的出现,以前认为已经很具安全性的512位密钥长度已经不再满足人们的需要。
1997年,RSA组织公布当时密钥长度的标准:个人使用768位密钥,公司使用1024位密钥,而一些非常重要的机构使用2048位密钥。
当时的人们预计到个人使用的768位密钥将在两年后就会生存期满,那么也就是指今年!所以密钥长度的选取也要考虑到这个长度不再具效力的预计时间。
RSA的安全性不能仅靠密钥的长度来保证。
在RSA算法中,还有一种值得注意的现象,那就是存在一些n p q=⨯,使得待加密消息经过若干次RSA变换后就会恢复成原文。
这不能不说是RSA本身具有的一个缺点,选择密钥时必须注意避免这种数。
第二章RSA加密算法的有关数学知识2. 1 数论本节主要介绍RSA算法所用到的数论事实。
2.1.1 模运算定义:给定一个整数n,如果用n去除两个整数a和b所得的余数相同,则称a和b关于模n同余,记为a b (mod n)。
从0 到处n – 1的整数a,它的模n 剩余是从0 到n – 1 之间的某个整数。
运算a mod n 表示a 被n 除的剩余,称为模n 运算。
例如,8mod5=3。
模算术同普通的算术一样,是可交换的、可结合的和可分配的。
而且,模n 运算的每一个中间结果,与先进行全部运算,再对最后的结果模n,其作用是一样的。
模运算的性质如下(a + b )mod n = ((a mod n) + (b mod n)) mod n(a - b )mod n = ((a mod n) - (b mod n)) mod n(a*b) mod n = (a mod n )*(b mod n) mod na(b + c) mod n = ((ab mod n) + (ac mod n)) mod n 密钥学中用了很多有关模的运算,因为像计算离散对数和模n平方根这样的问题是困难的。
模运算也很容易在计算机上实现,因为它将所有中间值和最后结果限制在一个范围内。
对一个k特的模n,任何加、减或乘的中间结果都不会超过2k比特长。
因此我们可以用模算术做指数运算而又不会产生巨大的中间结果。
2.1.2素数数论研究的重点是素数。
素数是指一个大于1且因子只有1 和它本身的整数。
除此之外没有其他数可以整除它。
2是一个素数学,其他素数如79,2821,236537734359等。
素数有无限多。
密码学,特别是公钥密码学,使用大素数学。
用VC++来判断素数为:void CRsaMY::OnButtonRandom() //随机产生P,Q,N,D,E{// TODO: Add your control notification handler code herelong q,p,e,fn,d,n;GetDlgItem(IDC_EDIT_P)->EnableWindow(false);GetDlgItem(IDC_EDIT_Q)->EnableWindow(false);GetDlgItem(IDC_EDIT_E)->EnableWindow(false);GetDlgItem(IDC_EDIT_D)->EnableWindow(false);GetDlgItem(IDC_EDIT_N)->EnableWindow(false);CString setstr;srand((unsigned)time(NULL));strat0 :p = rand();if(!sushu(p) || p > 200)goto strat0;elsem_p = p; //产生密钥参数Pstrat1 :q = rand();if(!sushu(q) || q > 200)goto strat1;elsem_q = q; //产生密钥参数Qif(!dengch(p,q) || abs(q - p) < 50)goto strat0;fn = (q-1)*(p-1);n = p*q;strat2 :e = rand();if(gcd(e,fn)==1 && e>1 && e<fn){m_e = e;d = euclib(e,fn);if(d<1 || !sushu(d))goto strat2;}elsegoto strat2; //产生私有密钥efm_d = d;fm_e = e;fm_n = n; //初始化全局变量m_d = d;m_n = n;UpdateData(false);}结果分析:由于产生的随机数的速度比较慢,所以在加密解密产生的密钥小一点儿,这样加密解密过程也快一点儿。