des算法代码加密后长度比原文增长多少! ...

posts - 286,&
comments - 1540,&
trackbacks - 0
常用加密算法的Java实现总结(二)
——对称加密算法DES、3DES和AES
文:阿蜜果
1、对称加密算法
对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文()和加密(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
1.2 优缺点
&&&&&&&& 优点:算法公开、计算量小、加密速度快、加密效率高。
&&&&&&&& 缺点:
(1)交易双方都使用同样钥匙,安全性得不到保证。
(2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为困难,使用成本较高。
1.3 常用对称加密算法
基于“”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。本文只介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。
DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
2.2 算法原理
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:
(1)初始置换
其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。
(2)逆置换
经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
2.3 五种分组模式2.3.1 EBC模式
2.有利于并行计算;
3.误差不会被传送;
1.不能隐藏明文的模式;
2.可能对明文进行主动攻击。
2.3.2 CBC模式
&&&&&&&& CBC模式又称为密码分组链接模式,示意图如下:
1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
1、不利于并行计算;
2、误差传递;
3、需要初始化向量IV。
2.3.3 CFB模式
&&&&&&&& CFB模式又称为密码发反馈模式,示意图如下图所示:
1、隐藏了明文模式;
2、分组密码转化为流模式;
3、可以及时加密传送小于分组的数据。
1、不利于并行计算;
2、误差传送:一个明文单元损坏影响多个单元;
3、唯一的IV。
2.3.4 OFB模式
&&&&&&&& OFB模式又称输出反馈模式,示意图所下图所示:
1、隐藏了明文模式;
2、分组密码转化为流模式;
3、可以及时加密传送小于分组的数据。
1、不利于并行计算;
2、对明文的主动攻击是可能的;
3、误差传送:一个明文单元损坏影响多个单元。
2.3.5 CTR模式
计数模式(CTR模式)加密是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。对于最后的数据块,可能是长u位的局部数据块,这u位就将用于异或操作,而剩下的b-u位将被丢弃(b表示块的长度)。CTR解密类似。这一系列的计数必须互不相同的。假定计数表示为T1, T2, …, Tn。CTR模式可定义如下:
CTR加密公式如下:
Cj = Pj XOR Ek(Tj)
C*n = P*n XOR MSBu(Ek(Tn)) j = 1,2… n-1;
CTR解密公式如下:
Pj = Cj XOR Ek(Tj)
P*n = C*n XOR MSBu(Ek(Tn)) j = 1,2 … n-1;
AES CTR模式的结构如图5所示。&
图5 AES CTR的模式结构
Fig 5 Structure of AES CTR Mode
加密方式:密码算法产生一个16 字节的伪随机码块流,伪随机码块与输入的明文进行异或运算后产生密文输出。密文与同样的伪随机码进行异或运算后可以重产生明文。
CTR&模式被广泛用于&ATM&网络安全和&IPSec应用中,相对于其它模式而言,CRT模式具有如下特点:
■硬件效率:允许同时处理多块明文&/&密文。
■&软件效率:允许并行计算,可以很好地利用&CPU&流水等并行技术。
■&预处理:算法和加密盒的输出不依靠明文和密文的输入,因此如果有足够的保证安全的存储器,加密算法将仅仅是一系列异或运算,这将极大地提高吞吐量。
■&随机访问:第&i&块密文的解密不依赖于第&i-1&块密文,提供很高的随机访问能力
■&可证明的安全性:能够证明&CTR&至少和其他模式一样安全(CBC,&CFB,&OFB,&...)
■&简单性:与其它模式不同,CTR模式仅要求实现加密算法,但不要求实现解密算法。对于&AES&等加/解密本质上不同的算法来说,这种简化是巨大的。
■&无填充,可以高效地作为流式加密使用。
2.4 常用的填充方式
&&&&&&&& 在Java进行DES、3DES和AES三种对称加密算法时,常采用的是NoPadding(不填充)、Zeros填充(0填充)、PKCS5Padding填充。
2.4.1 ZerosPadding
全部填充为0的字节,结果如下:
&&&&&& F1 F2 F3 F4 F5 F6 F7 F8&& //第一块
&&&&& F9 00 00 00 00 00 00 00&//第二块
2.4.2 PKCS5Padding
每个填充的字节都记录了填充的总字节数,结果如下:
&F1 F2 F3 F4 F5 F6 F7 F8&& //第一块
&F9 07 07 07 07 07 07 07&//第二块
2.5 Java中的DES实现
&&&&&&&& DES加密算法(ECB、无填充)的Java实现如下所示:
package&amigo.import&java.security.InvalidKeyEimport&java.security.Kimport&java.security.NoSuchAlgorithmEimport&java.security.SecureRimport&java.security.spec.InvalidKeySpecEimport&javax.crypto.Cimport&javax.crypto.SecretKimport&javax.crypto.SecretKeyFimport&javax.crypto.spec.DESKeySimport&mons.codec.binary.Base64;public&class&DESUtil&{&&&&//算法名称&&&&&public&static&final&String&KEY_ALGORITHM&=&"DES";&&&&//算法名称/加密模式/填充方式&&&&&//DES共有四种工作模式--&&ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式&&&&public&static&final&String&CIPHER_ALGORITHM&=&"DES/ECB/NoPadding";&&&&/**&*//**&&&&&*&&&&&&&&*&生成密钥key对象&&&&&*&&#64;param&KeyStr&密钥字符串&&&&&&*&&#64;return&密钥对象&&&&&&*&&#64;throws&InvalidKeyException&&&&&&&&*&&#64;throws&NoSuchAlgorithmException&&&&&&&&*&&#64;throws&InvalidKeySpecException&&&&&&&&*&&#64;throws&Exception&&&&&&*/&&&&private&static&SecretKey&keyGenerator(String&keyStr)&throws&Exception&{&&&&&&&&byte&input[]&=&HexString2Bytes(keyStr);&&&&&&&&DESKeySpec&desKey&=&new&DESKeySpec(input);&&&&&&&&//创建一个密匙工厂,然后用它把DESKeySpec转换成&&&&&&&&SecretKeyFactory&keyFactory&=&SecretKeyFactory.getInstance("DES");&&&&&&&&SecretKey&securekey&=&keyFactory.generateSecret(desKey);&&&&&&&&return&&&&&}&&&&private&static&int&parse(char&c)&{&&&&&&&&if&(c&&=&'a')&return&(c&-&'a'&+&<span style="color: #)&&&<span style="color: #x0f;&&&&&&&&if&(c&&=&'A')&return&(c&-&'A'&+&<span style="color: #)&&&<span style="color: #x0f;&&&&&&&&return&(c&-&'<span style="color: #')&&&<span style="color: #x0f;&&&&}&&&&//&从十六进制字符串到字节数组转换&&&&&public&static&byte[]&HexString2Bytes(String&hexstr)&{&&&&&&&&byte[]&b&=&new&byte[hexstr.length()&/&<span style="color: #];&&&&&&&&int&j&=&<span style="color: #;&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&b.&i++)&{&&&&&&&&&&&&char&c0&=&hexstr.charAt(j++);&&&&&&&&&&&&char&c1&=&hexstr.charAt(j++);&&&&&&&&&&&&b[i]&=&(byte)&((parse(c0)&&&&<span style="color: #)&|&parse(c1));&&&&&&&&}&&&&&&&&return&b;&&&&}&&&&/**&*//**&&&&&&*&加密数据&&&&&*&&#64;param&data&待加密数据&&&&&*&&#64;param&key&密钥&&&&&*&&#64;return&加密后的数据&&&&&&*/&&&&public&static&String&encrypt(String&data,&String&key)&throws&Exception&{&&&&&&&&Key&deskey&=&keyGenerator(key);&&&&&&&&//&实例化Cipher对象,它用于完成实际的加密操作&&&&&&&&Cipher&cipher&=&Cipher.getInstance(CIPHER_ALGORITHM);&&&&&&&&SecureRandom&random&=&new&SecureRandom();&&&&&&&&//&初始化Cipher对象,设置为加密模式&&&&&&&&cipher.init(Cipher.ENCRYPT_MODE,&deskey,&random);&&&&&&&&byte[]&results&=&cipher.doFinal(data.getBytes());&&&&&&&&//&该部分是为了与加解密在线测试网站(http://tripledes.online-/)的十六进制结果进行核对&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&results.&i++)&{&&&&&&&&&&&&System.out.print(results[i]&+&"&");&&&&&&&&}&&&&&&&&System.out.println();&&&&&&&&//&执行加密操作。加密后的结果通常都会用Base64编码进行传输&&&&&&&&&return&Base64.encodeBase64String(results);&&&&}&&&&/**&*//**&&&&&&*&解密数据&&&&&&*&&#64;param&data&待解密数据&&&&&&*&&#64;param&key&密钥&&&&&&*&&#64;return&解密后的数据&&&&&&*/&&&&public&static&String&decrypt(String&data,&String&key)&throws&Exception&{&&&&&&&&Key&deskey&=&keyGenerator(key);&&&&&&&&Cipher&cipher&=&Cipher.getInstance(CIPHER_ALGORITHM);&&&&&&&&//初始化Cipher对象,设置为解密模式&&&&&&&&cipher.init(Cipher.DECRYPT_MODE,&deskey);&&&&&&&&//&执行解密操作&&&&&&&&return&new&String(cipher.doFinal(Base64.decodeBase64(data)));&&&&}&&&&public&static&void&main(String[]&args)&throws&Exception&{&&&&&&&&String&source&=&"amigoxie";&&&&&&&&System.out.println("原文:&"&+&source);&&&&&&&&String&key&=&"A1B2C3D4E5F60708";&&&&&&&&String&encryptData&=&encrypt(source,&key);&&&&&&&&System.out.println("加密后:&"&+&encryptData);&&&&&&&&String&decryptData&=&decrypt(encryptData,&key);&&&&&&&&System.out.println("解密后:&"&+&decryptData);&&&&}}
&&& 测试结果:
原文:&amigoxie<span style="color: #&-<span style="color: #&<span style="color: #&-<span style="color: #7&-<span style="color: #&-<span style="color: #&-<span style="color: #&<span style="color: #&加密后:&YfEgi8fWpks=解密后:&amigoxie
&&& 为了核对测试结果是否正确,需要将结果与 &#8220;加密解密在线测试网站&#8221;()进行核对,在该网站的测试结果如下:
&&&&&&&& 左侧下方显示的加密结果&#8220;61 f1 20 8b c7 d6 a6 4b&#8221;是返回的16进制结果。与我们打印出的十进制&#8220;97 -15 32 -117 -57 -42 -90 75&#8221;是相对应的。
需要注意的是这个网站采用的填充方式是NoPadding,如果我们程序中采用PKCS5Padding或PKCS7Padding填充方式,这些填充方式在不足位时会进行填充,所以会跟我们在该测试网站看到的后面部分不一致。
另外Java的byte的范围是-128-127,而不是0~255,因此超过十六进制7f(对应127)的数在Java中会转换为负数。
【说明】DESUtil类中引入的org.bouncycastle.jce.provider.BouncyCastleProvider类在commons-codec-1.6.jar包中。
3DES(或称为Triple DES)是三重(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个应用三次DES。由于计算机运算能力的增强,原版DES密码的长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块。
3.2 算法原理
使用3条56位的对 数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的(1999年,NIST将3-DES指定为过渡的加密标准)。
其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的,P代表明文,C代表密文,这样:
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))
3DES解密过程为:P=Dk1(EK2(Dk3(C)))
3.3 Java中的3DES实现
&&&&&&&& 3DES的在Java的实现与DES类似,如下代码为3DES加密算法、CBC模式、NoPadding填充方式的加密解密结果,参考代码如下所示:
package&amigo.import&java.security.InvalidKeyEimport&java.security.Kimport&java.security.NoSuchAlgorithmEimport&java.security.Simport&java.security.spec.InvalidKeySpecEimport&javax.crypto.Cimport&javax.crypto.SecretKeyFimport&javax.crypto.spec.DESedeKeySimport&javax.crypto.spec.IvParameterSimport&org.bouncycastle.jce.provider.BouncyCastlePpublic&class&ThreeDESUtil&{&&&&//&算法名称&&&&&public&static&final&String&KEY_ALGORITHM&=&"desede";&&&&//&算法名称/加密模式/填充方式&&&&&public&static&final&String&CIPHER_ALGORITHM&=&"desede/CBC/NoPadding";&&&&/**&*//**&&&&&&*&CBC加密&&&&&&*&&#64;param&key&密钥&&&&&&*&&#64;param&keyiv&IV&&&&&&*&&#64;param&data&明文&&&&&&*&&#64;return&Base64编码的密文&&&&&&*&&#64;throws&Exception&&&&&&*/&&&&public&static&byte[]&des3EncodeCBC(byte[]&key,&byte[]&keyiv,&byte[]&data)&throws&Exception&{&&&&&&&&Security.addProvider(new&BouncyCastleProvider());&&&&&&&&&Key&deskey&=&keyGenerator(new&String(key));&&&&&&&&Cipher&cipher&=&Cipher.getInstance(CIPHER_ALGORITHM);&&&&&&&&IvParameterSpec&ips&=&new&IvParameterSpec(keyiv);&&&&&&&&cipher.init(Cipher.ENCRYPT_MODE,&deskey,&ips);&&&&&&&&byte[]&bOut&=&cipher.doFinal(data);&&&&&&&&for&(int&k&=&<span style="color: #;&k&&&bOut.&k++)&{&&&&&&&&&&&&System.out.print(bOut[k]&+&"&");&&&&&&&&}&&&&&&&&System.out.println("");&&&&&&&&return&bO&&&&}&&&&/**&*//**&&&&&&*&&&&&&&&*&生成密钥key对象&&&&&&*&&#64;param&KeyStr&密钥字符串&&&&&&*&&#64;return&密钥对象&&&&&&*&&#64;throws&InvalidKeyException&&&&&&&&*&&#64;throws&NoSuchAlgorithmException&&&&&&&&*&&#64;throws&InvalidKeySpecException&&&&&&&&*&&#64;throws&Exception&&&&&&*/&&&&private&static&Key&keyGenerator(String&keyStr)&throws&Exception&{&&&&&&&&byte&input[]&=&HexString2Bytes(keyStr);&&&&&&&&DESedeKeySpec&KeySpec&=&new&DESedeKeySpec(input);&&&&&&&&SecretKeyFactory&KeyFactory&=&SecretKeyFactory.getInstance(KEY_ALGORITHM);&&&&&&&&return&((Key)&(KeyFactory.generateSecret(((java.security.spec.KeySpec)&(KeySpec)))));&&&&}&&&&private&static&int&parse(char&c)&{&&&&&&&&if&(c&&=&'a')&return&(c&-&'a'&+&<span style="color: #)&&&<span style="color: #x0f;&&&&&&&&if&(c&&=&'A')&return&(c&-&'A'&+&<span style="color: #)&&&<span style="color: #x0f;&&&&&&&&return&(c&-&'<span style="color: #')&&&<span style="color: #x0f;&&&&}&&&&&//&从十六进制字符串到字节数组转换&&&&&public&static&byte[]&HexString2Bytes(String&hexstr)&{&&&&&&&&byte[]&b&=&new&byte[hexstr.length()&/&<span style="color: #];&&&&&&&&int&j&=&<span style="color: #;&&&&&&&&for&(int&i&=&<span style="color: #;&i&&&b.&i++)&{&&&&&&&&&&&&char&c0&=&hexstr.charAt(j++);&&&&&&&&&&&&char&c1&=&hexstr.charAt(j++);&&&&&&&&&&&&b[i]&=&(byte)&((parse(c0)&&&&<span style="color: #)&|&parse(c1));&&&&&&&&}&&&&&&&&return&b;&&&&}&&&&/**&*//**&&&&&&*&CBC解密&&&&&&*&&#64;param&key&密钥&&&&&&*&&#64;param&keyiv&IV&&&&&&*&&#64;param&data&Base64编码的密文&&&&&&*&&#64;return&明文&&&&&&*&&#64;throws&Exception&&&&&&*/&&&&public&static&byte[]&des3DecodeCBC(byte[]&key,&byte[]&keyiv,&byte[]&data)&throws&Exception&{&&&&&&&&Key&deskey&=&keyGenerator(new&String(key));&&&&&&&&Cipher&cipher&=&Cipher.getInstance(CIPHER_ALGORITHM);&&&&&&&&IvParameterSpec&ips&=&new&IvParameterSpec(keyiv);&&&&&&&&cipher.init(Cipher.DECRYPT_MODE,&deskey,&ips);&&&&&&&&byte[]&bOut&=&cipher.doFinal(data);&&&&&&&&return&bO&&&&}&&&&public&static&void&main(String[]&args)&throws&Exception&{&&&&&&&&byte[]&key&=&"<span style="color: #C4E60EFF838C0F7".getBytes();&&&&&&&&byte[]&keyiv&=&{&<span style="color: #,&<span style="color: #,&<span style="color: #,&<span style="color: #,&<span style="color: #,&<span style="color: #,&<span style="color: #,&<span style="color: #&};&&&&&&&&byte[]&data&=&"amigoxie".getBytes("UTF-8");&&&&&&&&System.out.println("data.length="&+&data.length);&&&&&&&&System.out.println("CBC加密解密");&&&&&&&&byte[]&str5&=&des3EncodeCBC(key,&keyiv,&data);&&&&&&&&System.out.println(new&sun.misc.BASE64Encoder().encode(str5));&&&&&&&&byte[]&str6&=&des3DecodeCBC(key,&keyiv,&str5);&&&&&&&&System.out.println(new&String(str6,&"UTF-8"));&&&&}}
&&&& 测试结果如下所示:
data.length=<span style="color: #CBC加密解密-<span style="color: #&<span style="color: #&<span style="color: #8&<span style="color: #&<span style="color: #&-<span style="color: #2&-<span style="color: #&-<span style="color: #&4AZsKhiQvt4=amigoxie
&&&& 加密解密在线测试网站的3DES可选择CBC模式,无填充方式选项,采用NoPadding填充方式,加密结果如下所示:
&&&&&&&ThreeDESUtil的测试代码中打印出的加密后的byte数组为:&#8220;-32 6 108 42 24 -112 -66 -34&#8221;,正是在线测试网站返回的十六进制&#8220;e0 &&06&6c&2a&18&90&be&de&#8221;在Java中的十进制表示(Java中byte范围为:-128~127,所以超过127的数会被转换成负数)。
【说明】ThreeDESUtil类中引入的org.bouncycastle.jce.provider.BouncyCastleProvider类在bcprov-jdk16-1.46.jar包中。
4、AES加密
&&&&&&&& 待写。
5、参考文档
&&&&&&&& 《对称加密算法_百度百科》:
&&&&&&&& 《DES_百度百科》:
《加密解密在线测试网站》:
《/CTR》:
《密码学 数据块填充模式》:
《3DES_百度百科》:
阅读(15586)
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
期待博主更新&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
学习了.&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
受益匪浅&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
就我这样的非专业人士看起来复杂难懂啊&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
这个该怎么弄上链接呢?&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
java aes ios aesyou mei you?&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
好极了&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
学习一下&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
对于我来说还是太深奥&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
伟大的职位,感谢分享&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
慕名学习&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
知道最浅显的,这个还在学习了!&&&&&&
&re: 常用加密算法的Java实现总结(二)——对称加密算法DES、3DES和AES
好帖子。我需要它。感謝信息&&&&&&
29301234578910111213141516171819202122232425262728293031123456789
&&&&&&生活将我们磨圆,是为了让我们滚得更远&#8212;&#8212;&#8220;圆&#8221;来如此。&&&&& 我的作品:&&&&&&&&&&&&&&&(2012年1月出版)&&&&&&&&&&(2010年5月出版)&&&&&
留言簿(241)
积分与排名
阅读排行榜
评论排行榜维基百科,自由的百科全书
(重定向自)
数据加密标准(DES,Data Encryption Standard)是一种使用的,1976年被联邦政府的确定为(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的。这个算法因为包含一些设计元素,相对短的以及怀疑内含(NSA)的而在开始时有争议,DES因此受到了强烈的学院派式的审查,并以此推动了现代的及其的发展。
DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。1999年1月,与合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以应用。为了提供实用所需的安全性,可以使用DES的衍生算法来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为(前国家标准局)的一个标准。
在某些文献中,作为算法的DES被称为DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来。在发音时,DES可以作为按字母拼出来(),或作为一个词念成。
DES最初出现在1970年代早期。1972年,在一个对美国政府的需求的研究得出结果后,NBS(国家标准局,现在的NIST)开始征集用于加密政府内非机密敏感信息的加密标准。因此日,在咨询了(NSA)之后,NBS向公众征集可以满足严格设计标准的加密算法。然而,没有一个提案可以满足这些要求。因此在,日,NBS开始了第二次征集。这一次,提交了一种在年间发展的算法,这份提案被有限度的接受了。这种算法是基于早先(Horst Fiestel)提出的算法的。費斯妥,(Walter Tuchman),(Don Coppersmith),艾伦·康海姆(Alan Konheim),卡尔·梅尔(Carl Meyer),迈克·马加什(Mike Matyas),罗伊·阿德勒(Roy Adler),(Edna Grossman),比尔·诺兹(Bill Notz),林恩·史密斯(Lynn Smith)以及等人参与了IBM在算法设计和分析方面的工作。
日,被选中的DES在“”上公布并征集公众意见。次年,NBS举行了两个开放式研讨会以讨论该标准。不同团体提出了一些意见,其中先驱(Martin Hellman)和(Whitfield Diffie)认为过短以及神奇的“”是NSA的不当干涉的结果。这项论点指出,算法被情报部门秘密的削弱了,使得他们—而不是别人—可以简单的读取加密信息。S盒的设计者之一,艾伦·康海姆指出:“我们将S盒发给了华盛顿,而他们发回来的S盒变得完全不同了。”因此,审查了NSA的行为以判断是否存在不当行为。在1978年出版的一份公开的总结中,该委员会写道:
在DES的开发中,NSA使IBM确信缩短后的密钥长度也可以满足需求,间接的帮助了S盒结构的开发,并确认最终的DES算法可以在他们所知范围内没有任何统计学的或数学的弱点。
然而,也有人提到了:
NSA没有以任何方式干涉算法的设计。IBM发明和设计了该算法,做出了一切相关决定,并一致同意密钥长度超出了所有DES涉及的商业应用的需要。
DES小组的另一个成员,沃尔特·塔克曼说:“完全在IBM内,由我们IBM人,发展了DES算法。NSA没有干涉任何设计问题!”相反,一本解密了的NSA关于加密历史的书则写道:
1973年NBS向私人工业征集数据加密标准。第一份投标方案令人失望,因此NSA开始研究它自己的算法。此后,负责研究和工程的主任霍华德·罗森布拉姆(Howard Rosenblum)发现IBM的沃尔特·塔克曼正在研究修改Lucifer以适应一般应用。NSA为塔克曼发放了一份许可,让他与情报部门一起研究Lucifer的改进方案。
NSA与IBM紧密合作以增强算法针对除了暴力破解以外的攻击方式,并增强被称为S盒的置换表的强度。同时,很矛盾的,NSA试图说服IBM将密钥长度从64位削减到48位,而最终他们达成了妥协,使用56位的密钥长度。
由于(Eli Biham)和(Adi Shamir)独立发现和公开了,一种破解块密码的通用方法,针对S盒中隐藏的弱点的怀疑在1990年平静了下来。DES的S盒的设计使得该算法对这种攻击方法的抵抗能力大大强于随机的S盒,该事实强烈的支持了IBM在1970年代就已经知道了其中的技术背景的说法。这的确是事实—1994年,科柏密斯公开了一些原创的S盒的设计准则。据(Steven Levy)说,IBM的沃森研究院(Watson)在1974年发现了微分密码攻击,而NSA要求保持技术秘密。科柏密斯解释IBM的保密决定说:“那是因为微分密码攻击是一种强有力的针对许多算法的工具,因此有人认为公开这样的信息可能对国家安全产生不利影响。”列维引用沃尔特·塔克曼的话说:“他们让我们将我们所有的文件可靠的封存起来...我们的确对每一份文件进行编号,并将它们放在保险箱里,因为这些文件被认为是美国政府机密。他们说这样做,所以我照做了。”
虽然仍有一些批评,DES在1976年11月被确定为联邦标准,并在日作为 PUB 46发布,被授权用于所有非机密资料。它在1988年(修订为FIPS-46-1),1993年(FIPS-46-2)和1999年(FIPS-46-3),后者被规定为(见下文)。日,DES终于在公开竞争中被(AES)所取代。日,FIPS 46-3被官方的拒绝了,但确认在2030年以前均可用于敏感政府信息的加密。
DES算法也定义在了 X3.92,以及ISO/IEC 18033-3中(作为的一部分)。
1994年发表了另一种理论攻击方法,线性密码分析,但1998年的一次显示DES可以被实用的破解,显示了替代算法的迫切需求。晚些时候的文章更详细的探讨了这些的方法。
DES的导入被认为是密码学的学术研究的催化剂,尤其是对块密码的密码分析。NIST对DES的回顾中提到:
DES可以被称为对加密算法的非军用研究和发展的开始。1970年代除了为军队或情报组织工作的以外,只有很少的密码学者,对密码学的学术研究也很少。现在则有许多活跃的学术性的密码学者,善于密码学方面编程的数学部分,以及商业信息安全公司和顾问。一整代的密码学者都拼命分析(或者说,破解)DES算法。用密码学家的话说:“DES在促进密码学界的发展上做的比其它的一切都多。现在有一种算法供学者们分析了。”在年代,密码学中关于DES的公开文献所占的比例令人大吃一惊,而且DES是用来对每一种进行比较的标准对象。
NBS第一次征集加密算法标准
NBS第二次征集加密算法标准
DES在“联邦公报”上发布并征集意见
DES的第一次研讨会
第二次研讨会,讨论DES的数学基础
DES被确认为标准
DES被作为FIPS标准FIPS PUB 46发布
DES第一次延长标准期限
HBO开始使用一个基于DES的电视卫星加密系统, II
DES第二次延长标准期限,称为FIPS 46-1,取代FIPS PUB 46
毕汉姆和萨莫尔重新发现了,并将之应用到了一个15位的类DES密码系统
毕汉姆和萨莫尔发布了第一个复杂性小于暴力破解的理论攻击方法:。然而,这种方法仍然需要不现实的247。
DES作为FIPS 46-2第三次延长标准期限
试验了第一个实验性的DES密码分析,线性密码分析
第一次公开破解了DES加密的信息
的DES破解器(Deep Crack)在56小时内破解了DES密钥
和合作在22小时15分钟内破解了一个DES密钥
DES作为FIPS46-3第四次延长标准期限,其中规定优先使用,而普通DES只允许在遗留的系统中应用
AES作为FIPS 197发布
AES标准开始生效
“联邦公报”发布了FIPS 46-3以及一系列相关标准被驳回的信息
NIST拒绝了FIPS 46-3标准
德国鲁尔大学和基尔大学基于的价值$10,000的并行计算机在9天内破解了DES在一年内,软件改进将平均时间降低到了6.4天。
的下一代,RIVYERA将平均破解时间降低到了一天内
安全方面和对DES相对慢的速度的考虑使得研究者在1980年代晚期和1990年代早期提出了一系列替代的设计,包括,,,,,和。这些设计的大多数保持了DES的64位的块大小,可以作为DES的直接替代方案,虽然这些方案通常使用64位或128位的密钥。导入了算法,该算法的块大小为64位,而密钥长度为256位,并在晚些时候的得到了应用。
DES本身可以应用和重用到更安全的环境中。许多前DES用户现在使用,这是一个由DES的专利持有人描述和分析的标准;它相当于用两个(2TDES)或三个(3TDES)不同的密钥对数据进行三次DES加密。3DES被认为是十分安全的,虽然它的速度较慢。另一个计算花费较小的替代算法是,它通过将数据在DES加密前后分别与额外的密钥信息进行来增加密钥长度。则是一种速度较快的DES变体,但它对微分密码分析较敏感。
2000年10月,在历时接近5年的征集和选拔之后,NIST选择了一种新的密码,(AES)替代DES。日,联邦公报发表了AES标准,以此开始了其标准化进程,并于日成为FIPS PUB 197标准。AES算法在提交的时候称为。选拔中其它进入决赛的算法包括,,和。
—DES中的总体費斯妥结构
为简明起见,下文中的叙述省略的各变换和置换的细节,可以在中找到对应的查找表。
DES是一种典型的—一种将固定长度的通过一系列复杂的操作变成同样长度的的算法。对DES而言,为64位。同时,DES使用来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于,并在算法中被丢弃。因此,DES的有效为56位,通常称DES的密钥长度为56位。
与其它块密码相似,DES自身并不是加密的实用手段,而必须以某种进行实际操作。FIPS-81确定了DES使用的几种模式。FIPS-74包括了更多关于DES使用的讨论。
算法的整体结构如图1所示:有16个相同的处理过程,称为“回次”(round),并在首尾各有一次,称为IP与FP(或称IP-1,FP为IP的(即IP“撤销”FP的操作,反之亦然)。IP和FP几乎没有密码学上的重要性,为了在1970年代中期的硬件上简化输入输出数据库的过程而被显式的包括在标准中。
在主处理回次前,数据块被分成两个32位的半块,并被分别处理;这种交叉的方式被称为。費斯妥结构保证了加密和解密过程足够相似—唯一的区别在于子密钥在解密时是以反向的顺序应用的,而剩余部分均相同。这样的设计大大简化了算法的实现,尤其是硬件实现,因为没有区分加密和解密算法的需要。
图中的⊕符号代表(XOR)操作。“F函数”将数据半块与某个子密钥进行处理。然后,一个F函数的输出与另一个半块异或之后,再与原本的半块组合并交换顺序,进入下一个回次的处理。在最后一个回次完成时,两个半块需要交换顺序,这是費斯妥结构的一个特点,以保证加解密的过程相似。
图2中显示了費斯妥函数(F函数)的过程。其每次对半块(32位)进行操作,并包括四个步骤:
—DES的費斯妥函数(F函数)
扩张—用(图中的E)将32位的半块扩展到48位,其输出包括8个6位的块,每块包含4位对应的输入位,加上两个邻接的块中紧邻的位。
与密钥混合—用异或操作将扩张的结果和一个子密钥进行混合。16个48位的子密钥—每个用于一个回次的F变换—是利用从主密钥生成的(见)。
S盒—在与子密钥混合之后,块被分成8个6位的块,然后使用“”,或称“置换盒”进行处理。8个S盒的每一个都使用以方式提供的非线性的变换将它的6个输入位变成4个输出位。S盒提供了DES的核心安全性—如果没有S盒,密码会是线性的,很容易破解。
置换—最后,S盒的32个输出位利用固定的,“”进行重组。这个设计是为了将每个S盒的4位输出在下一回次的扩张后,使用4个不同的S盒进行处理。
S盒,P置换和E扩张各自满足了在1940年代提出的实用密码所需的必要条件,“”。
—DES的密钥调度
图3显示了加密过程中的密钥调度—产生子密钥的算法。首先,使用选择置换1(PC-1)从64位输入密钥中选出56位的密钥—剩下的8位要么直接丢弃,要么作为。然后,56位分成两个28位的半密钥;每个半密钥接下来都被分别处理。在接下来的回次中,两个半密钥都被左移1或2位(由回次数决定),然后通过选择置换2(PC-2)产生48位的子密钥—每个半密钥24位。移位(图中由&&标示)表明每个子密钥中使用了不同的位,每个位大致在16个子密钥中的14个出现。
解密过程中,除了子密钥输出的顺序相反外,密钥调度的过程与加密完全相同。
虽然已发表的针对DES的密码分析的研究文章多于所有其它的块密码,到目前为止,最实用的攻击方法仍然是暴力攻击。已知DES有一些次要的可能导致加密强度降低的密码学特性,同时有3种理论攻击的理论复杂性小于暴力破解,但需要不现实的或数量,并无实用价值。
对于一切密码而言,最基本的攻击方法是—依次尝试所有可能的密钥。决定了可能的密钥数量,因此也决定了这种方法的可行性。对于DES,即使在它成为标准之前就有一些关于其密钥长度的适当性的问题,而且也正是它的密钥长度,而不是理论密码分析迫使它被后续算法所替代。在设计时,在与包括NSA在内的外部顾问讨论后,密钥长度被从128位减少到了56位以适应在单芯片上实现算法。
的价值250,000美元的DES破解器包括1,856个自定义的芯片,可以在数天内破解一个DES密钥—本图显示了使用数个Deep Crack芯片搭成的
在学术上,曾有数个DES破解器被提出。1977年,迪菲和海尔曼提出了一部造价约2千万美元的破解器,可以在一天内找到一个DES密钥。1993年,迈克尔·维纳设计了一部造价约1百万美元的破解器,大约可以在7小时内找到一个密钥。然而,这些早期的设计并没有被实现,至少没有公开的实现。在1990年代晚期,DES开始受到实用的攻击。1997年,赞助了一系列的竞赛,奖励第一个成功破解以DES加密的信息的队伍1万美元,洛克·韦尔谢什(Rocke Verser),马特·柯廷(Matt Curtin)和贾斯廷·多尔斯基(Justin Dolske)领导的获胜,该计划使用了数千台连接到的计算机的闲置计算能力。1998年,(EFF,一个信息人权组织)制造了一台,造价约$250,000。该破解器可以用稍多于2天的时间暴力破解一个密钥,它显示了迅速破解DES的可能性。EFF的动力来自于向大众显示DES不仅在理论上,也在实用上是可破解的:
许多人在亲眼见到一个事实前不会相信它。向他们显示一台实际的机器可以在数天内破解DES是让某些人相信他们不能依赖DES的安全性的唯一方法。
下一个确认的DES破解器是2006年由德国的与的工作组建造的COPACOBANA。与EFF的不同,COPACOBANA由商业上可获得的,可重配置的组成。120片并行的 Spartan3-1000型FPGA分为20个DIMM模块,每个模块包括6个FPGA。使用可重配置的FPGA使得这种设备也可以用于其它密码的破解。另外一个关于COPACOBANA的有趣事实是它的成本。一台COPACOBANA的造价大约是$10,000,是EFF设备的25分之一,这充分说明了的持续进步。考虑到因素,同样价格的设备的性能在8年间大约提到了30倍。2007年,COPACOBANA的两个项目参与者组建的SciEngines公司改进了COPACOBANA,并发展了它的下一代。2008年,他们的COPACOBANA RIVYERA将破解DES的时间减少到了1天以内,使用128片Spartan-3 5000型FPGA。目前SciEngines的RIVYEAR保持着使用暴力破解法破解DES的纪录。
有三种已知方法可以以小于暴力破解的复杂性破解DES的全部16回次:(DC),(LC),以及。然而,这些攻击都是理论性的,难以用于实践;它们有时被归结于认证的弱点。
微分密码分析在1980年代晚期由和重新发现;1970年代IBM和NSA便发现了这种方法,但没有公开。为了破解全部16回次,微分密码分析需要247组。DES被设计为对DC具有抵抗性。
线性密码分析由(Mitsuru Matsui)发现,需要243组;该方法已被实现,是第一种公开的实验性的针对DES的密码分析。没有证据显示DES的设计可以抵抗这种攻击方法。一般概念上的LC—“多线性密码分析”—在1994年由Kaliski和Robshaw所建议,并由比留科夫等人于2004年所改进。线性密码分析的选择明文变种是一种类似的减少数据复杂性的方法。帕斯卡尔·朱诺德(Pascal Junod)在2001年进行了一些确定线性密码分析的实际时间复杂性的实验,结果显示它比预期的要快,需要约239–241次操作。
改进的戴维斯攻击:线性和微分密码分析是针对很多算法的通用技术,而戴维斯攻击是一种针对DES的特别技术,在1980年代由(Donald Davies)首先提出,并于1997年为毕汉姆和(Alex Biryukov)所改进。其最有效的攻击形式需要250,计算复杂性亦为250,成功率为51%。
也有一些其它的针对削减了回次的密码版本,即少于16回次的DES版本。这些攻击显示了多少回次是安全所需的,以及完整版本拥有多少“安全余量”。于1994年为兰福德(Langford)和海尔曼所提出,是一种组合了微分和线性密码分析的方法。一种增强的微分线性密码分析版本可以利用215.8组已知明文可以以229.2的时间复杂性破解9回次的DES。
DES有特性,即
其中是的补码,是以为密钥的加密函数,和分别表示平文和密文。这样的性质表明暴力破解的工作量在选择明文攻击下可以减少一半。
DES有四个所谓的弱密钥。若使用弱密钥,加密和解密有相同的效果(参见):
也有6对半弱密钥。若使用某个半弱密钥进行加密,则相当于使用其对应的半弱密钥进行解密:
在实现中可以轻易的避开弱密钥和半弱密钥,可以显式的测试密钥,或简单的随机选择密钥:刚好选到弱或半弱密钥的可能性几乎没有。这些密钥事实上并不比其它的密钥弱,因为他们没有给攻击以任何可利用的好处。
DES也被证明不是,或更精确的,集合(对于所有可能的密钥)在之下不是一个群,也不“近似”于一个群。这有时是一个开放式的问题,而且若是这种情况,破解DES是可能的,且类似于的加密模式不能增加其安全性。
DES的最大密码学安全性被限制在了约64位,除非独立选择每个回次的子密钥而不是从密钥中生成,这样做可以将允许768位的安全性。
朱诺德, P.
Selected Areas in Cryptography, 2001, pp199–211.
Knudsen, Lars, John Erik Mathiassen:一种针对DES的选择平文线性攻击. Fast Software Encryption 2000: pp262–272
塔克曼, W.. A brief history of the data encryption standard. Internet besieged: countering cyberspace scofflaws. ACM Press/Addison-Wesley Publishing Co. New York, NY, USA. 1997: pp.&#160;275–280.
RSA实验室. . .
施奈尔. 应用密码学 2nd.&#160;: 280.
与, “NBS的DES密码分析完全调查” IEEE Computer 10 (6), June 1977, pp74–84
戴维斯, D.W.; W.L. Price. 计算机网络安全 2nd. John Wiley & Sons. 1989.
Robert Sugarman (editor). 关于阻止计算机犯罪. IEEE Spectrum (). 1979-07.
P. Kinnucan. 数据加密权威:塔克曼, W.和梅尔. Cryptologia. 1978-10, 2 (4): 371. :.
约翰逊, T. 美国冷战期间的密码学,.第三部:解雇和重组,. 美国密码学历史.
约翰逊, T. . , DOCID 3417193 (file released on , hosted at cryptome.org).
Konheim. 计算机安全和密码学.&#160;: 301.
.(1994). . IBM Journal of Research and Development, 38(3), 243–250.
,加密:如何使用代码打败政府—在数字时代保护隐私, p55, 2001, .
NBS,数据加密标准, FIPS-Pub.46. NBS,美国商务部,华盛顿特区, 1977年1月.
美国国家标准协会,ANSI X3.92-1981 “美国国家标准,数据加密算法”
. Iso.org.
施奈尔, B.,应用密码学,协议,算法和C源码,第二版,John Wiley and Sons, New York (1996) p. 267
William E. Burr, "Data Encryption Standard", in NIST's anthology "测量,标准和技术中整个世纪的卓越:
NBS/NIST文献选集编年史,.
松井充. . Lecture Notes in Computer Science. 1994, 839: 1–11. :.
松井充. . Lecture Notes in Computer Science. 1994, 765: 386–397. :.()
FIPS PUB 46-3:描述DES标准的最新官方文档](PDF)
. Edocket.access.gpo.gov. .
S. Kumar, C. Paar, J. Pelzl, G. Pfeiffer, A. Rupp, M. Schimmler, "如何用8,980欧元破解DES". 2nd Workshop on Special-purpose Hardware for Attacking Cryptographic Systems&#160;—SHARCS 2006, Cologne, Germany, April 3–4, 2006.
GOST 28147-89:加密,解密和消息验证码(MAC)算法
联邦公报第66卷,40号,日
NIST发布了加密标准的中选者
. Itl.nist.gov. .
. Itl.nist.gov. .
Stallings, W.密码学和网络安全:原理和实践. Prentice Hall, 2006. p. 73
[Press release of Firm, demonstrated on 2009 Workshop]
和. . Journal of Cryptology. 1991, 4 (1): 3–72. :.()
毕汉姆, E和萨莫尔, A.,针对DES的微分密码攻击, Springer Verlag, 1993. , .
松井充. . Lecture Notes in Computer Science. 1994, 765: 386–397. :.
Kaliski, Burton S., :使用多近似的线性密码攻击. CRYPTO 1994: pp26–39
比留科夫, A, C. De Canniere和M. Quisquater. . Lecture Notes in Computer Science. 2004, 3152: 1–22. :.().
毕汉姆, E.一种新的快速DES软件实现,
毕汉姆, E.和:对DES的戴维斯攻击的改进. J. Cryptology 10 (3): 195–206 (1997)
兰福德, Susan K.,马丁·E·海尔曼:微分线性密码分析. CRYPTO
毕汉姆, E., Orr Dunkelman, Nathan Keller:改进的微分线性密码分析. ASIACRYPT 2002: pp254–266
坎贝尔, K.,维纳, M.: DES不是一个群. CRYPTO 1992: pp512–520
Ehrsam等,《用于数据安全的块密码系统产品》, , 日发布
Gilmore, John,《破解DES:加密研究的秘密,窃听政策和芯片设计》, 1998, O'Reilly,
的价值$10,000的DES破解器
:隐藏分类:

我要回帖

更多关于 des算法代码 的文章

 

随机推荐