深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
3D 22 64 C6 57 D1 C4 C3 CF 77 CE 2F D0 E1 78 2A 4D ED 7A A8 83 F9 0E 14 E1 BA 38
7B 06 41 8D B5 E9 3F 00 0D C3 28 D1 F9 6D 17 4B 6E A7 41 68 40
解密后数据:
使用C#编写DES加密程序的framework
DES算法具有极高的安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。通过穷尽搜索空间,可获得总共256(大约7.2×1016)个可能的密钥。如果每秒能检测一百万个的话,需要2000年完成检测。可见,这是很难实现的。当然,随着 科学 技术的 发展 ,当出现超高速 计算 机后,可以考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。随着信息化和数字化社会的发展,随着计算机和Inte rnet的普及,密码学必将在国家安全、 经济 交流、 网络 安全及人民生活等方面发挥更大作用[3]。
3.3 DES的安全性和应用误区
DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。
DES算法中只用到64位密钥中的其中56位,而第8、16、24、......64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,..... .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。
3.4 DES的拓展
3.4.1 3DES
12
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密表,这样,
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1((EK2(Dk3(C))) [4] 3.4.2 AES算法
AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。
应用:主要用于基于私钥数据加密算法的各种信息安全技术和安全产品中: 1、无线网络应用2、信息安全领域3、AES软件应用4、虚拟专用网、同步光网络、远程访问服务器,高速路由器、移动通信、卫星通信、电子金融业务等。
13
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
4 公开加密算法RSA
本章主要介绍非对称加密算法RSA的基本原理以及其算法结构,并举出RSA算法的一个具体实例进行分析,最后讨论一下RSA的探索——大整数运算。
4.1 RSA的简介
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。
RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。
这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。
4.2 RSA算法的结构
RSA加密算法使用了两个非常大的素数来产生公钥和私钥。即使从一个公钥中通过因数分解可以得到私钥,但这个运算所包含的 计算 量是非常巨大的,以至于在现实上是不可行的。加密算法本身也是很慢的,这使得使用rsa算法加密大量的数据变的有些不可行。这就使得一些现实中加密算法都基于rsa加密算法。pgp算法(以及大多数基于rsa算法的加密方法)使用公钥来加密一个对称加密算法的密钥,然后再利用一个快速的对称加密算法来加密数据。
14
深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述
(1)RSA算法原理
RSA算法是基于数论中的同余理论。如果用m代表明文,c代表密文,E(m)代表加密运算,D(c)代表解密运算,x=y(mode z)表示x和y模z同余,则加密和解密算法简单表示如下:
加密算法 c=E(m)=me(mod n) 解密算法 m=D(c)=cd(mod n)
其中n和密钥e是公开的,而密钥d是保密的。 下面讨论密钥的求取:
①选取两个随机大素数p和q(保密); ②设n=p×q;
③欧拉函数φ(n)=(p-1)(q-1)(保密);
④选取与φ(n)互素的正整数e,即满足gcd(φ(n),e)=1和0 由RSA算法原理可知,RSA算法的核心是求模取余运算,其安全性是建立在大合数因子分解困难的基础之上的。 (2)模运算的实现 RSA算法的核心操作也是最耗时的操作是模运算,所以开发一种快速指数和取模运算是解决运算速度的关键。通常的模运算都是利用加减法来实现的,因为加减法指令的执行速度快。在进行模运算时,一般先将指数e(长度为kbit)改写成二进制数组的形式e,即 其中:ei∈{0,1},i=0,1,Λ,k-1。 这样,在计算me(mod n)时,先做一次平方运算,然后根据ei的值,再做一次乘法运算,以此来简化模运算的复杂性。 由于实际中的e值非常大,为了提高运算速度,可以将e进行分组后运算。设对e以四位一组(十六进制)的形式计算me(mod n),那么: 其中:ei∈{0,1,2,?,15},t=k/4; ②求出m2,m3,?,m15(mod n); ③设置变量c:=1; ④对于i=t-1,t-2,?,1,0重复计算: c:=c2(mod n)(平方); 15 深圳学历教育www.szstudy.com.cn深圳成人高考 数据加密技术的研究综述 c:=c2(mod n)(四次方); c:=c2(mod n)(八次方); c:=c2(mod n)(十六次方); e.若ei≠0,则c:=c×mei(mod n)。 ⑤所得c即为所求。 4.3 RSA算法的案例 例如大数18446744073709551615,等于 ffffffff ffffffff,就相当于十 进制的99:有两位,每位都是ffffffff。而18446744073709551616 等于00000001 0000000000000000,就相当于十进制的100:有三位,第一位是1 ,其它两位是0,如此等等。 在实际应用中,“数字”数组的排列顺序采用低位在前高位在后的方式,这样,大数A 就可以方便地用数学表达式来表示其值:A=Sum[i=0 to n](A[i]*0x100000000**i)(其中Sum 表示求和,A[i]表示用以记录A 的数组的第i 个元素,**表示乘方)。 任何整数运算最终都能分解成数字与数字之间的运算,在0x100000000 进制下其“数字”最大达到0xffffffff,其数字与数字之间的运算,结果也必然超出了目前32系统的字长。在VC++中,存在一个__int64 类型可以处理64位的整数,所以不用担心这一问题,而在其它编译系统中如果不存在64位整形,就需要采用更小的进制方式来存储大数,例如WORD类型(16位)可以用来表示0x10000 进制,但效率更高的办法还是采用32位的DWORD 类型,只不过将0x100000000 进制改成0x40000000进制,这样两个数字进行四则运算的最大结果为 0x3fffffff * 0x3fffffff,小于0xffffffff,只是不能简单地用高位低位来将运算结果拆分成两个“数字”。 加法 设: A=Sum[i=0 to p](A[i]*0x100000000**i) B=Sum[i=0 to q](B[i]*0x100000000**i),p>=q C=Sum[i=0 to n](C[i]*0x100000000**i)=A+B 显然: C[i]不是简单地等于A[i]+B[i],因为如果C[i]>0xffffffff就需要进位,当然计算C[i-1]时也可能产生了进位,所以计算C[i]时还要加上上次的进位值。 16