3des加密(双倍长)(ECB,CBC)详细介绍
来源:互联网 发布:剑网三军爷脸数据 编辑:程序博客网 时间:2024/05/29 12:31
网上查了下关于ECB和CBC加密,只有一些图文介绍,没有详细步骤,现在在这里记录一下自己的使用过程。
参考资料:http://blog.csdn.net/aaaaatiger/article/details/2525561
需要详细了解的朋友请自行查找其它资料,我只在这里介绍一下中间加密器的过程,以16字节密钥为例。
一、DES加密和解密
/** * DES加密 * */public static byte[] encryptDes(byte[] key, byte[] src) {try {// 创建一个DESKeySpec对象DESKeySpec desKey = new DESKeySpec(key);// 创建一个密匙工厂SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 将DESKeySpec对象转换成SecretKey对象SecretKey secretKey = keyFactory.generateSecret(desKey);// Cipher对象实际完成解密操作Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");// 用密匙初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 现在,获取数据并加密// 正式执行加密操作return cipher.doFinal(src);} catch (Exception e) {e.printStackTrace();}return null;}/** * des解密 * * @param key * @param src * @return */public static byte[] decryptDes(byte[] key, byte[] src) {try {// DES算法要求有一个可信任的随机数源SecureRandom random = new SecureRandom();// 创建一个DESKeySpec对象DESKeySpec desKey = new DESKeySpec(key);// 创建一个密匙工厂SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");// 将DESKeySpec对象转换成SecretKey对象SecretKey secretKey = keyFactory.generateSecret(desKey);// Cipher对象实际完成解密操作Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");// 用密匙初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey, random);// 现在,获取数据并加密// 正式执行加密操作return cipher.doFinal(src);} catch (Exception e) {e.printStackTrace();}return null;}
这是java自带的des加密
二、ECB加密
/**
*加密
*/
public static String encryptECB3Des(String key, String src) {System.out.println("encryptECB3Des->" + "key:" + key);System.out.println("encryptECB3Des->" + "src:" + src);int len = key.length();if (key == null || src == null) {return null;}if (src.length() % 16 != 0) {return null;}if (len == 32) {String outData = "";String str = "";for (int i = 0; i < src.length() / 16; i++) {str = src.substring(i * 16, (i + 1) * 16);outData += encECB3Des(key, str);}return outData;}return null;}public static String encECB3Des(String key, String src) {byte[] temp = null;byte[] temp1 = null;temp1 = encryptDes(stringToHexBytes(key.substring(0, 16)), stringToHexBytes(src));temp = decryptDes(stringToHexBytes(key.substring(16, 32)), temp1);temp1 = encryptDes(stringToHexBytes(key.substring(0, 16)), temp);return byte2HexString(temp1, "");}public static String decECB3Des(String key, String src) {byte[] temp2 = decryptDes(stringToHexBytes(key.substring(0, 16)), stringToHexBytes(src));byte[] temp1 = encryptDes(stringToHexBytes(key.substring(16, 32)), temp2);byte[] dest = decryptDes(stringToHexBytes(key.substring(0, 16)), temp1);return byte2HexString(dest, "");}/** * 3DES(双倍长) 解密 * * @param keybyte * @param src * @return */public static String decryptECB3Des(String key, String src) {if (key == null || src == null) {return null;}if (src.length() % 16 != 0) {return null;}if (key.length() == 32) {String outData = "";String str = "";for (int i = 0; i < src.length() / 16; i++) {str = src.substring(i * 16, (i + 1) * 16);outData += decECB3Des(key, str);}return outData;}return null;}
加密的原理是:1、使用密钥的前8个字节对数据的8个字节进行des加密得到temp1。
2、使用密钥的后8个字节对temp1进行des解密得到temp2。
3、使用密钥的前8个字节对temp2做des加密得到最后的密文。
代码中间有几处转换,转换原理为“0x11“转换成字符串“11”,和将字符串“11”转换成字节“0x11”。
三、CBC加密和解密
public static String encryptCBC3Des(String key, String src) {String IV = "0000000000000000";return encryptCBC3Des(IV, key, src);}/** * 3DES(双倍长) 加密 * * @param keybyte * @param src * @return */public static String encryptCBC3Des(String IV, String key, String src) {String outData = "";String enc = IV;byte[] strBs = null;byte[] encBs = null;byte[] b2 = new byte[8];for (int i = 0; i < src.length() / 16; i++) {strBs = stringToHexBytes(src.substring(i * 16, (i + 1) * 16));encBs = stringToHexBytes(enc);for (int j = 0; j < b2.length; j++) {b2[j] = (byte) (encBs[j] ^ strBs[j]);}enc = encECB3Des(key, byte2HexString(b2, ""));outData += enc;}return outData;}public static String decryptCBC3Des(String key, String src) {String IV = "0000000000000000";return decryptCBC3Des(IV, key, src);}/** * 3DES(双倍长) 解密 * * @param keybyte * @param src * @return */public static String decryptCBC3Des(String IV, String key, String src) {String outData = "";String enc = IV;String str = "";byte[] encBs = null;byte[] decBs = null;byte[] b2 = new byte[8];for (int i = 0; i < src.length() / 16; i++) {str = src.substring(i * 16, (i + 1) * 16);decBs = stringToHexBytes(decECB3Des(key, str));encBs = stringToHexBytes(enc);for (int j = 0; j < b2.length; j++) {b2[j] = (byte) (encBs[j] ^ decBs[j]);}enc = str;outData += byte2HexString(b2, "");}return outData;
ECB和CBC对8字节数据的加密过程相同,CBC方式会把后面一组数据的明文和前面一组数据的密文异或,只是不同的地方。
0 0
- 3des加密(双倍长)(ECB,CBC)详细介绍
- 3DES 和 ECB CBC 加密方式
- android java 3des加密 ECB/CBC
- 3DES 和 ECB CBC 加密方式
- 3DES 和 ECB CBC 加密方式
- 3DES 和 ECB CBC 加密方式
- DES(ECB) DES(CBC) 3DES
- ECB CBC and 3DES
- ECB CBC and 3DES
- ECB CBC and 3DES
- ECB CBC and 3DES
- ECB CBC and 3DES
- DES加密,ECB和CBC区别
- DES ECB CBC and 3DES
- 3DES、DES的CBC、ECB
- DES加密(单倍长、双倍长、三倍长)
- triple Des加密之ECB加密解密、CBC加密解密
- [DES] 加密类别说明 ECB CBC DES TDES
- 岁月悠长,秋深情暖
- 在Unity3D中加载外部图片的两种方法
- 为什么 Nginx 的性能要比 Apache 高很多?
- MFC:创建dll和调用dll
- SuperMap iServer SDK 博客集锦
- 3des加密(双倍长)(ECB,CBC)详细介绍
- 运行android程序控制台输出异常The connection to adb is down, and a severe error has occured
- C#DES加密解密
- 浅谈ThreadLocal
- CodeForces
- 赫夫曼树与赫夫曼编码
- 我有一个秘密
- Linux初级学习第十二单元
- [Java]Stack栈和Heap堆的区别