常用加密算法的实现总结二对称des3和aes_第1页
常用加密算法的实现总结二对称des3和aes_第2页
常用加密算法的实现总结二对称des3和aes_第3页
常用加密算法的实现总结二对称des3和aes_第4页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2016年8月30日 常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - Blog Java1/11常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES常用加密算法的Java实现总结(二) 对称加密算法DES、3DES和AES日期:201 4/ 7 / 6文:1、对称加密算法1.1 定义对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和 钥(mi y ue)一起经过特殊加密算法处理后,使其变成复杂的 文 出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行 ,才能使

2、其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和 ,这就要求 方事先必须知道 钥。1.2 优缺点优点:算法公开、计算量小、加密速度快、加密效率高。缺点:(1 ) 双方都使用同样钥匙,安全性得不到保证。(2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式 系统上使用较为 ,主要是因为密钥管理 ,使用成本较高。1.3 常用对称加密算法基于“对称密钥”的加密算法主要有DES、3 DES(TripleDES)、A ES、RC2、RC4、RC5

3、 和Blowfish等。本文只 最常用的对 称加密算法DES、3 DES(TripleDES)和A ES。2、DES2.1 概述DES算法全称为Data Encry ption Standard,即数据加密算法,它是IBM公司于1 97 5 年研究 并公开 的。DES算法的 参数有三个:Key 、Data、Mode。其中Key 为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被 的数据;Mode为DES的工作方式,有两种:加密或 。2.2 算法原理DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:Blog J

4、av a 首页 新随笔 新文章 聚合 管理posts - 298, comments - 1622, trackbacks - 0你所浪费的今天,是昨天死去的人奢望的明天。你所厌恶的现在,是未来的你回不去的曾经。2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJava(1)初始置换其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到 第一位,第50位换到第2位依此类推,最后一位是原来的第7 位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右3 2

5、位,例:设置换前的输入值为D1 D2D3D64,则经过初始置换后的结果为:L0=D58D50D8;R0=D57 D49D7 。(2)逆置换经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。2.3 3 五种分组模式2.3.1 EBC模式优点:1 .简单;2.有利于并行计算;3.误差 被传送;缺点:1 .不能隐藏明文的模式;2.可能对明文进行主动 。CBC模式又称为 分组 模式,示意图如下:优点:1 .不容易主动 ,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。2/112.3.2 CBC模式2016年8月30

6、日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJava缺点:1 、不利于并行计算;2、误差传递;3、需要初始化向量IV。CFB模式又称为 发反馈模式,示意图如下图所示:优点:1 、隐藏了明文模式;2、分组 转化为流模式;3、可以及时加密传送小于分组的数据。缺点:1 、不利于并行计算;2、误差传送:一个明文单元损坏影响多个单元;3、唯一的IV。OFB模式又称输出反馈模式,示意图所下图所示:3/112.3.4 OFB模式2.3.3 CFB模式2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJ

7、ava优点:1 、隐藏了明文模式;2、分组 转化为流模式;3、可以及时加密传送小于分组的数据。缺点:1 、不利于并行计算;2、对明文的主动 是可能的;3、误差传送:一个明文单元损坏影响多个单元。计数模式(CTR模式)加密是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。对于 最后的数据块,可能是长u位的局部数据块,这u位就将用于异或操作,而剩下的b-u位将被丢弃(b表示块的长度)。CTR 类似。这一系列的计数必须互不相同的。假定计数表示为T1 , T2, , Tn。CTR模式可定义如下:CTR加密公式如下:Cj = Pj XOR Ek(Tj)C*n = P

8、*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 Mode4/112.3.5 CTR模式2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJava加密方式: 算法产生一个16 字节的伪随机码块流,伪随机码块与输入的明文进行异或运算后产生密文输出。密文与同样的伪随机码进行

9、异或运算后可以重产生明文。CTR 模式被广泛用于 ATM 安全和 IPSec应用中,相对于其它模式而言,CRT模式具有如下特点: 硬件效率: 同时处理多块明文 / 密文。 软件效率: 并行计算,可以很好地利用 CPU 流水等并行技术。 预处理:算法和加密盒的输出不依靠明文和密文的输入,因此如果有足够的保证安全的 器,加密算法将仅仅是一系列异或运算,这将极大地提高吞吐量。 随机 :第 i 块密文的 不依赖于第 i-1 块密文,提供很高的随机 能力 可证明的安全性:能够证明 CTR 至少和其他模式一样安全(CBC, CFB, OFB, .) 简单性:与其它模式不同,CTR模式仅要求实现加密算法,但

10、不要求实现 算法。对于 AES 等加/ 本质上不同的算法来说,这种简化是巨大的。 无填充,可以高效地作为流式加密使用。2.4 常用的填充方式在Java进行DES、3DES和AES三种对称加密算法时,常采用的是NoPadding(不填充)、Zeros填充(0填充)、PKCS5Padding 填充。全部填充为0的字节,结果如下:F1 F2 F3 F4 F5 F6 F7 F8 /第一块F9 00 00 00 00 00 00 00 /第二块每个填充的字节都 了填充的总字节数,结果如下:F1 F2 F3 F4 F5 F6 F7 F8 /第一块F9 07 07 07 07 07 07 07 /第二块2.

11、5 Java中的DES实现DES加密算法(ECB、无填充)的Java实现如下所示:5/112.4.2 PKCS5Padding2.4.1 ZerosPadding2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - 阿蜜果 - BlogJava6/11package amigo.endecrypt;import java.security.InvalidKey Exception; import java.security.Key;import java.security.NoSuchAlgorithmException; import java.s

12、ecurity.SecureRandom;import java.security.spec.InvalidKey SpecException;import javax.crypto.Cipher; import javax.crypto.SecretKey;import javax.crypto.SecretKey Factory; import javax.crypto.spec.DESKey Spec;import mons.codec.binary.Base64;public class DESUtil /算法名称public static final String KEY _ALGO

13、RITHM = "DES"/算法名称/加密模式/填充方式/DES共有四种工作模式->>ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式public static final String CIPHER_ALGORITHM = "DES/ECB/NoPadding"/* 生成密钥key对象* param Key Str 密钥字符串* return 密钥对象* throws InvalidKey Exception* throws NoSuchAlgorithmException* throws Inv

14、alidKey SpecException* throws Exception*/private static SecretKey key Generator(String key Str) throws Exception byte input = Hex String2Bytes(key Str);DESKey Spec desKey = new DESKey Spec(input);/创建一个密匙工厂,然后用它把DESKey Spec转换成SecretKey Factory key Factory = SecretKey Factory.getInstance("DES&quo

15、t;); SecretKey securekey = key Factory.generateSecret(desKey);return securekey;private static int parse(char c) if (c >= 'a') return (c - 'a' + 10) & 0x 0f;if (c >= 'A') return (c - 'A' + 10) & 0x 0f; return (c - '0') & 0x 0f;/ 从十六进制字符串到字节数组转

16、换public static byte Hex String2Bytes(String hexstr) byte b = new bytehexstr.length() / 2;int j = 0;for (int i = 0; i < b.length; i+) char c0 = hexstr.charAt(j+); char c1 = hexstr.charAt(j+);bi = (byte) (parse(c0) << 4) | parse(c1 );return b;/* 加密数据* param data 待加密数据* param key 密钥2016年8月30日常

17、用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - 阿蜜果 - BlogJava测试结果:为了核对测试结果是否正确,需要将结果与 “加密解密在线测试网站”(http:/tripledes.online-domain-7/11原文: amigoxie97 -15 32 -117 -57 -42 -90 7 5加密后: Y fEgi8fWpks=解密后: amigoxie* return 加密后的数据*/public static String encrypt(String data, String key) throws Exception Key deskey = ke

18、y Generator(key);/ 实例化Cipher对象,它用于完成实际的加密操作Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); SecureRandom random = new SecureRandom();/ 初始化Cipher对象,设置为加密模式cipher.init(Cipher.ENCRY PT_MODE, deskey, random); byte results = cipher.doFinal(data.getBytes();/ 该部分是为了与加解密在线测试网站(http:/tripledes.online-do

19、main-for (int i = 0; i < results.length; i+) System.out.print(resultsi + " ");System.out.println();/ 执行加密操作。加密后的结果通常都会用Base64编码进行传输return Base64.encodeBase64String(results);/* 解密数据* param data 待解密数据* param key 密钥* return 解密后的数据*/public static String decrypt(String data, String key) thro

20、ws Exception Key deskey = key Generator(key);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);/初始化Cipher对象,设置为解密模式cipher.init(Cipher.DECRY PT_MODE, deskey);/ 执行解密操作return new String(cipher.doFinal(Base64.decodeBase64(data);public static void main(String args) throws Exception String source = &qu

21、ot;amigoxie"System.out.println("原文: " + source); String key = "A 1 B2C3D4E5F607 08"String encryptData = encrypt(source, key); System.out.println("加密后: " + encryptData); String decryptData = decrypt(encryptData, key); System.out.println("解密后: " + decryptDa

22、ta);2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJava左侧下方显示的加密结果“61 f1 20 8b c7 d6 a6 4b”是返回的16进制结果。与我们打印出的十进制“97 -15 32 -117 -57 -42 -90 7 5 ”是相对应的。需要注意的是这个 采用的填充方式是NoPadding,如果我们 采用PKCS5 Padding或PKCS7 Padding填充方式,这些填充方式在不足位时会进行填充,所以会跟我们在该测试 看到的后面部分不一致。另外Java的byte的范围是-128-127,而不是0255,因此超过

23、十六进制7f(对应127)的数在Java中会转换为负数。【说明】DESUtil类中引入的vider.BouncyCastleProvider类在commons-codec-1.6.jar包中。3、3DES3.1 概述3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encry ption Algorithm)块 的通称。它相当于是对每 个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES 的密钥长度变得容易被 ;3DES即是设计用来提供一种相对简单的 ,即通过增加DES的密钥长度来避免类似

24、的 ,而不是设计一种全新的块 算法。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填充方式的加密 结果,参

25、考代码如下所示:8/11package amigo.endecry pt;import java.security .InvalidKey Exception;2016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJavaimport jav a.security .Key ;import jav a.security .NoSuchAlgorithmException; import jav a.security .Security ;import jav a.security .spec.Inv alidKey Spec Except

26、ion;import jav ax.cry pto.Cipher;import jav ax.cry pto.SecretKey Factory ; import jav ax.cry pto.spec.DESedeKey Spec; import jav ax.cry pto.spec.Iv ParameterSpec;import org.bouncy v ider.Bouncy CastleProv ider;public class ThreeDESUtil / 算法名称public static final String KEY _ALGORITHM =

27、"desede"/ 算法名称/加密模式/填充方式public static final String CIPHER_ALGORITHM = "desede/CBC/NoPadding"/* CBC加密* param key 密钥* param key iv IV* param data 明文* return Base64编码的密文* throws Exception*/public static by te des3EncodeCBC(by te key , by te key iv , by te data) throws Exception Secu

28、rity .addProv ider(new Bouncy CastleProv ider();Key deskey = key Generator(new String(key );Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); Iv ParameterSpec ips = new Iv ParameterSpec(key iv ); cipher.init(Cipher.ENCRY PT_MODE, deskey , ips);by te bOut = cipher.doFinal(data); for (int k = 0; k

29、 < bOut.length; k+) Sy stem.out.print(bOutk + " ");Sy stem.out.println(""); return bOut;/* 生成密钥key 对象* param Key Str 密钥字符串* return 密钥对象* throws Inv alidKey Exception* throws NoSuchAlgorithmException* throws Inv alidKey Spec Exception* throws Exception*/priv ate static Key key

30、Generator(String key Str) throws Exception by te input = Hex String2By tes(key Str);DESedeKey Spec Key Spec = new DESedeKey Spec(input);SecretKey Factory Key Factory = SecretKey Factory .getInstance(KEY _ALGORITHM); return (Key ) (Key Factory .generateSecret(jav a.security .spec.Key Spec) (Key Spec)

31、;priv ate static int parse(char c) if (c >= 'a') return (c - 'a' + 10) & 0x 0f;if (c >= 'A') return (c - 'A' + 10) & 0x 0f; return (c - '0') & 0x 0f;9/112016年8月30日常用加密算法的Java实现总结(二)对称加密算法DES、3DES和AES - - BlogJava测试结果如下所示:加密 测试 的3DES可选择CBC模式,无

32、填充方式选项,采用NoPadding填充方式,加密结果如下所示:10/11data.length=8 CBC加密-32 6 108 42 24 -112 -66 -344AZsKhiQvt4= amigoxie/ 从十六进制字符串到字节数组转换public static byte Hex String2Bytes(String hexstr) byte b = new bytehexstr.length() / 2;int j = 0;for (int i = 0; i < b.length; i+) char c0 = hexstr.charAt(j+); char c1 = hexs

33、tr.charAt(j+);bi = (byte) (parse(c0) << 4) | parse(c1 );return b;/* CBC* param key 密钥* param keyiv IV* param data Base64编码的密文* return 明文* throws Exception*/public static byte des3DecodeCBC(byte key, byte keyiv, byte data) throws Exception Key deskey = key Generator(new String(key);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); Iv ParameterSpec ips = new Iv ParameterSpec(keyiv); cipher.init(Cipher.DECRY PT_MODE, deskey, ips);byte bOut = cipher.doFinal(data); return bOut;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论