3des加密有不同的加密模式和填充模式,这个网上很多不多说了,只要保证加解密的时候加密模式和填充模式保持一致就可以了
首先对于密钥的生成,java中有2种方式:
1.第一种,采用ECB模式和不填充模式
//加密
public static byte[] des3EncodeECB(byte[] key, byte[] data)
throws Exception {
Key deskey = null;
SecretKeySpec spec = new SecretKeySpec(key,"desede");
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("desede" + "/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
//解密
public static byte[] des3DecodeECB(byte[] key, byte[] data)
throws Exception {
Key deskey = null;
SecretKeySpec spec = new SecretKeySpec(key,"desede");
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
deskey = keyfactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("DESede" + "/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);
return bOut;
}
2.第二种,同样采用ECB模式和不填充模式
//加密
public static byte[] encrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, getKey(key, mode));
byte[] result = cipher.doFinal(targetToByte);
// System.out.println("base64:" +encryptByBase64(result));
return result;
}
//解密
public static byte[] decrypt(byte[] targetToByte, String algorithm,String mode, String key) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, getKey(key, mode));
byte[] result = cipher.doFinal(targetToByte);
// System.out.println("base:" + new String(result,"UTF-8"));
return result;
} public static Key getKey(String key, String algorithm) {
try {
KeyGenerator generator = KeyGenerator.getInstance(algorithm);
//注意此处将key按照16进制数字解析成byte数组,按需要修改,比如key.getBytes()
generator.init(new SecureRandom(HexString2Bytes(key)));
return generator.generateKey(); } catch (Exception e) {
e.printStackTrace();
}
return null;
}

  两种方式的区别,第一种就是使用你给定的key作为密钥,当与其他客户端进行通信,加解密不是由同一方操作的时候推荐使用,第二种是根据你给的key来生成一个新的key,这个新的key才是真正加密时使用的key,所以如果用第一种加密出来的密文用第二种来解密,是解不出来的。

  另外,java中只提供了3倍长3des的算法,也就是key的长度必须是24字节,如果想要使用2倍长3des,需要自己将后8个字节补全(就是将16个字节的前8个字节补到最后,变成24字节)。如果提供的key不足24字节,将会报错,如果超过24字节,将会截取前24字节作为key(坑了我好长时间)
 
3des的加密过程
3DES,分为2种,一个是双倍长3DES,一个是三倍长3DES。
如果是双倍长3DES,密钥为16字节长,按左右,分别LK(密钥的左边8字节),RK(密钥的右边8字节)。加密内容DATA为8字节。
假设单倍长DES加密过程为:DES( data, key, dest ),其中,data为被加密数据,key为加密密钥,dest为加密结果。单倍长DES解密过程为:UDES(data, key, dest ),其中,data为被解密的数据,key为解密密钥,dest为解密结果。
那么,双倍长3DES的加密方法为:
DES( DATA, LK, TMP1 );
UDES( TMP1, RK, TMP2 );
DES( DATA, LK, DEST );
DEST是最终得到的密文。具体过程简述如下:
1)使用密钥的前8字节,对数据DATA进行加密,得到加密的结果TMP1;
2)使用密钥的后8字节,对第一的计算结果TMP1,进行解密,得到解密的结果TMP2;
3)再次使用密钥的前8字节,对第二次的计算结果TMP2,进行加密,得到加密的结果DEST。DEST就为最终的结果。
对于三倍长3DES,密钥长度的为24字节长。可以分为LK(密钥的左边8字节),CK(密钥的中间8字节),RK(密钥的左边8字节)。与二倍长3DES的加密过程基本相同,只是第一次计算,使用密钥LK;第二次计算,使用密钥CK;第三次计算,使用密钥LK。基本过程如下:
DES( DATA, LK, TMP1 );
UDES( TMP1, CK, TMP2 );
DES( TMP2, RK, DEST );
 
 

最新文章

  1. 【淘淘】Quartz之集群利弊
  2. 常用SQL总结
  3. 设置type为file的input标签选择图片类型
  4. pyc 文件反编译 py uncompyle2
  5. iOS 瀑布流的基本原理
  6. Google Play市场考察报告
  7. 自动构建工具Ant的使用-笔记
  8. python中的select模块
  9. 201521123028 《Java程序设计》第10周学习总结
  10. .netcore mvc docker环境jenkins一键部署(DevOps)
  11. Exploit-Exercises nebule 旅行日志(六)
  12. 【XSY1295】calc n个点n条边无向连通图计数 prufer序列
  13. 第四百一十三节,python面向对象,组合、类创建的本质、依赖注入
  14. Spark数据分析-记录关联问题
  15. solr6.4.1搜索引擎(3)增量同步mysql数据库
  16. PAT 乙级 1049 数列的片段和(20) C++版
  17. Android知识点textview加横线的属性
  18. 上海高校金马五校赛 F题:1 + 2 = 3?
  19. angular学习笔记(三十)-指令(7)-compile和link(1)
  20. cannot nest '/dubboService/src/main/resources' inside '/dubboService/src/main' .To enable the nesting exclude '/resources' from '/dubboService/src/main'

热门文章

  1. C++——函数及调用
  2. Airbnb React/JSX 编码规范
  3. HDU 6693 Valentine's Day (概率)
  4. ArabellaCPC 2019
  5. C# WinForm控件之advTree
  6. 6-MySQL-Ubuntu-操作数据表的基本操作(一)
  7. spring boot Swagger2(version=2.7.0) 注解@ApiImplicitParam的属性dataType值为”自定义泛型“应用
  8. async / await对异步的处理
  9. tzfile - 时区信息
  10. docker Dockerfile学习---nginx负载均衡tomcat服务