gistfile1.txt 今天看到一段3DES加密算法的代码,用的参数是DESede/CBC/PKCS5Padding,感觉比较陌生,于是学习了一下。遇到的java代码如下:Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding");以前写
今天看到一段3DES加密算法的代码,用的参数是DESede/CBC/PKCS5Padding,感觉比较陌生,于是学习了一下。 遇到的java代码如下: Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding"); 以前写的代码,给的参数都是DES或DESede。实际上DESede是简写,它与DESede/ECB/PKCS5Padding等价。这个参数分为三段。 - 第一段是加密算法的名称,如DESede实际上是3-DES。这一段还可以放其它的对称加密算法,如Blowfish等。 - 第二段是分组加密的模式,除了CBC和ECB之外,还可以是NONE/CFB/QFB等。最常用的就是CBC和ECB了。DES采用分组加密的方式,将明文按8字节(64位)分组分别加密。如果每个组独立处理,则是ECB。CBC的处理方式是先用初始向量IV对第一组加密,再用第一组的密文作为密钥对第二组加密,然后依次完成整个加密操作。如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,但CBC则不会。 - 第三段是指最后一个分组的填充方式。大部分情况下,明文并非刚好64位的倍数。对于最后一个分组,如果长度小于64位,则需要用数据填充至64位。PKCS5Padding是常用的填充方式,如果没有指定,默认的方式就是它。 补充一点,虽然DES的有效密钥长度是56位,但要求密钥长度是64位(8字节)。3DES则要求24字节(修改代码,32位密钥也可以)。 在CBC(不光是DES算法)模式下,iv通过随机数(或伪随机)机制产生是一种比较常见的方法。iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途径。ThreeDEScbcUtil.java
package com.dmt.util; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; /** * ThreeDEScbcUtil {3DES加密解密的工具类 } * 32位密钥 加密方式:DESede/CBC/PKCS5Padding * @author ly * @date 2017-11-16 */ public class ThreeDEScbcUtil { //DES算法要求有一个可信任的随机数源,同一次加解密随机数要保持一致 private static IvParameterSpec iv = null; public static IvParameterSpec ivDes3CBC(byte[] key){ try { // DES算法要求有一个可信任的随机数源 //此类提供加密的强随机数生成器 (RNG)。许多实现都是伪随机数生成器 (PRNG) 形式 SecureRandom random = new SecureRandom(); byte seed[] = random.generateSeed(8);//调用 generateSeed 方法来生成给定的种子字节数 iv = new IvParameterSpec(seed); System.out.println("十六进制的iv的随机数的ASCII:"+byteToHexASICC(seed)); return iv; } catch (Exception e) { e.printStackTrace(); } return null; } // 加密数据 public static byte[] encryptDes3CBC(byte[] message, byte[] key, IvParameterSpec iv) { try { // SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);// 密钥32位 // 创建一个密匙工厂,然后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); // encrypt Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, securekey, iv); // 现在,获取数据并加密 // 正式执行加密操作 byte[] encryptedData = cipher.doFinal(message); return encryptedData; } catch (Exception e) { e.printStackTrace(); } return null; } // 解密密数据 /** * 功能:解密密数据 将byte[]的字节数组转ASICC码 * @param byte[] message 加密数据的字节数组 * @param byte[] key 密钥的字节数组 * @param IvParameterSpec iv 字节数组 * @return ASICC码(也是16进制) */ public static byte[] decryptDes3CBC(byte[] message, byte[] key, IvParameterSpec iv) { try { // SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);// 密钥32位 // 创建一个密匙工厂,然后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); // decrypt // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, iv); // 现在,获取数据并加密 // 正式执行加密操作 byte[] decryptPlainText = cipher.doFinal(message); return decryptPlainText; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 功能:将byte[]的字节数组转ASICC码 * @param bytes 字节数组 * @return ASICC码(也是16进制) */ public static String byteToHexASICC(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } /** * 功能:将十六进制字符串转换为字节数组 * * @param hex * 十六进制字符串 * @return 字节数组 */ public static byte[] hextobyte(String hex) { int len = hex.length(); byte[] buf = new byte[(len + 1) / 2]; int i = 0; int j = 0; if ((len % 2) == 1) { buf[j++] = (byte) hexchartoint(hex.charAt(i++)); } while (i < len) { buf[j++] = (byte) ((hexchartoint(hex.charAt(i++)) << 4) | hexchartoint(hex .charAt(i++))); } return buf; } /** * 功能:将十六进制的char转换为十进制的int值 * * @param ch * 十六进制的char * @return 十进制 int值 */ public static int hexchartoint(char ch) { if (ch >= '0' && ch <= '9') { return ch - '0'; } if (ch >= 'A' && ch <= 'F') { return ch - 'A' + 10; } if (ch >= 'a' && ch <= 'f') { return ch - 'a' + 10; } throw new IllegalArgumentException("invalid hex digit '" + ch + "'"); } public static void main(String[] args) throws Exception { // 添加新安全算法,如果用JCE就要把它添加进去 //Security.addProvider(new com.sun.crypto.provider.SunJCE()); byte[] key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0".getBytes(); byte[] username = "bj_simsys".getBytes(); ivDes3CBC(key);//一次加解密所用的随机数必须是同一个 byte[] encryptPlainText = encryptDes3CBC(username,key,iv); System.out.println("加密_3des_cbc: " + byteToHexASICC(encryptPlainText)); // String ciperIV = PropertiesUtil.getValue("ciperIV"); // IvParameterSpec iv = new IvParameterSpec(hextobyte(ciperIV)); // byte[] decryptPlainText = decryptDes3CBC(hextobyte("D574F066CF044E7A7B4430CABE6B7C7F"), key, iv); byte[] decryptPlainText = decryptDes3CBC(encryptPlainText, key, iv); System.out.println("解密_3des_cbc: " + new String(decryptPlainText)); } //完整方法 /* public static void main(String[] args) throws Exception { // // 添加新安全算法,如果用JCE就要把它添加进去 // //Security.addProvider(new com.sun.crypto.provider.SunJCE()); byte[] key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0".getBytes(); byte[] username = "bj_simsys".getBytes(); IvParameterSpec iv = null; // SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);//密钥32位 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); // DES算法要求有一个可信任的随机数源,同一次加解密随机数要保持一致 SecureRandom random = new SecureRandom(); byte seed[] = random.generateSeed(8);//调用 generateSeed 方法来生成给定的种子字节数 IvParameterSpec iv = new IvParameterSpec(seed); //encrypt Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, securekey, iv); byte[] encryptedData = cipher.doFinal(username); System.out.println("encrypt_3des_cbc: " + byteToHexString(encryptedData)); //decrypt cipher.init(Cipher.DECRYPT_MODE, securekey, iv); byte[] decryptPlainText = cipher.doFinal(encryptedData); System.out.println("encrypt_3des_cbc22: " + new String(decryptPlainText)); }*/ }ThreeDESecbUtil.java
package com.dmt.util; import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; /** * ThreeDESecbUtil {3DES加密解密的工具类 } * 32位密钥 加密方式:DESede即DESede/ECB/PKCS5Padding * @author ly * @date 2017-11-15 */ public class ThreeDESecbUtil { /** 定义加密算法,有DES、DESede(即3DES)、Blowfish*/ private static final String Algorithm = "DESede"; /** 密钥 */ private static SecretKey securekey; /** * 加密方法 * @param src 源数据的字节数组 * @return */ public static byte[] encryptMode(String enKey, byte[] src) { try { DESedeKeySpec dks = new DESedeKeySpec(enKey.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm); securekey = keyFactory.generateSecret(dks); Cipher c1 = Cipher.getInstance(Algorithm); // 实例化负责加密/解密的Cipher工具类 c1.init(Cipher.ENCRYPT_MODE, securekey); // 初始化为加密模式 return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 解密函数 * @param src 密文的字节数组 * @return */ public static byte[] decryptMode(String enKey, byte[] src) { try { DESedeKeySpec dks = new DESedeKeySpec(enKey.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm); securekey = keyFactory.generateSecret(dks); Cipher c = Cipher.getInstance(Algorithm); c.init(Cipher.DECRYPT_MODE, securekey); // 初始化为解密模式 return c.doFinal(src); } catch (java.security.NoSuchAlgorithmException e) { e.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e) { e.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 功能:将十六进制字符串转换为字节数组 * @param hex 十六进制字符串 * @return byte 字节数组 */ public static byte[] hextobyteString(String hex) { int len = hex.length(); byte[] buf = new byte[(len + 1) / 2]; int i = 0; int j = 0; if ((len % 2) == 1) { buf[j++] = (byte) hexchartoint(hex.charAt(i++)); } while (i < len) { buf[j++] = (byte) ((hexchartoint(hex.charAt(i++)) << 4) | hexchartoint(hex.charAt(i++))); } return buf; } /** * (将十六进制的char转换为十进制的int值) */ public static int hexchartoint(char ch) { if (ch >= '0' && ch <= '9') { return ch - '0'; } if (ch >= 'A' && ch <= 'F') { return ch - 'A' + 10; } if (ch >= 'a' && ch <= 'f') { return ch - 'a' + 10; } throw new IllegalArgumentException("invalid hex digit '" + ch + "'"); } /** * 根据字符串生成密钥字节数组 * * @param keyStr * 密钥字符串 * @return * @throws UnsupportedEncodingException */ public static byte[] build3DesKey(String keyStr)throws UnsupportedEncodingException { byte[] key = new byte[24]; // 声明一个位的字节数组,默认里面都是0 byte[] temp = keyStr.getBytes("UTF-8"); // 将字符串转成字节数组 /* * 执行数组拷贝 System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位) */ if (key.length > temp.length) { // 如果temp不够位,则拷贝temp数组整个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, temp.length); } else { // 如果temp大于位,则拷贝temp数组个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, key.length); } System.out.println("【十六进制24字节-密钥】:1A2B3C4D5E6F78901234"); // System.out.println("【ASCII-密钥】:"+byteToHexString(key)); return key; } //字节(二进制)转ASICC码 public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } public static void main(String[] args) { String msg = "bj_simsys";//3DES加密解密案例 String key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0";//3DES加密解密案例 System.out.println("【加密前】:" + msg); //加密 byte[] secretArr = ThreeDESecbUtil.encryptMode(key, msg.getBytes()); // System.out.println("【加密后】:" + new String(secretArr)); System.out.println("【加密后】:"+byteToHexString(secretArr)); //解密 byte[] myMsgArr = ThreeDESecbUtil.decryptMode(key, secretArr); System.out.println("【解密后】:" + new String(myMsgArr)); } }DES.java
package com.dmt.des; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.crypto.SecretKeyFactory; import javax.crypto.SecretKey; import javax.crypto.Cipher; /** * DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究, * 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力, * 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现 。 * 注意:DES加密和解密过程中,密钥长度都必须是8的倍数 */ public class DES { public static void main(String args[]) { // 待加密内容 String username = "bj_simsys";// 测试内容 // 密码,长度要是8的倍数 String key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0"; byte[] result = DES.encrypt(username.getBytes(), key); //System.out.println("解密后:" + new String(result));//字节看不懂 System.out.println("加密后:" + byteToHexString(result)); //解密 byte[] decryResult = DES.decrypt(result, key); System.out.println("解密后:" + new String(decryResult)); } /** * 加密 * * @param datasource * byte[] * @param password * String * @return byte[] */ public static byte[] encrypt(byte[] datasource, String password) { try { SecureRandom random = new SecureRandom(); DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 创建一个密匙工厂,然后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, random); // 现在,获取数据并加密 // 正式执行加密操作 return cipher.doFinal(datasource); } catch (Throwable e) { e.printStackTrace(); } return null; } /** * 解密 * * @param src * byte[] * @param password * String * @return byte[] * @throws Exception */ public static byte[] decrypt(byte[] src, String password) { try { // DES算法要求有一个可信任的随机数源 SecureRandom random = new SecureRandom(); // 创建一个DESKeySpec对象 DESKeySpec desKey = new DESKeySpec(password.getBytes()); // 创建一个密匙工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // 将DESKeySpec对象转换成SecretKey对象 SecretKey securekey = keyFactory.generateSecret(desKey); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance("DES"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, random); // 真正开始解密操作 return cipher.doFinal(src); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 字节转ASICC码 */ public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } }Des3CBC.java
package com.dmt.des; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import org.apache.commons.net.nntp.NewGroupsOrNewsQuery; public class Des3CBC { private static IvParameterSpec iv = null; public static IvParameterSpec ivDes3CBC(byte[] key){ try { // DES算法要求有一个可信任的随机数源 //此类提供加密的强随机数生成器 (RNG)。许多实现都是伪随机数生成器 (PRNG) 形式 SecureRandom random = new SecureRandom(); byte seed[] = random.generateSeed(8);//调用 generateSeed 方法来生成给定的种子字节数 iv = new IvParameterSpec(seed); System.out.println("十六进制的iv的随机数的ASCII:"+byteToHexASICC(seed)); return iv; } catch (Exception e) { e.printStackTrace(); } return null; } // 加密数据 public static byte[] encryptDes3CBC(byte[] message, byte[] key){ try { //SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);//密钥32位 // 创建一个密匙工厂,然后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); //encrypt Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, securekey, iv); // 现在,获取数据并加密 // 正式执行加密操作 byte[] encryptedData = cipher.doFinal(message); return encryptedData; } catch (Exception e) { e.printStackTrace(); } return null; } // 解密密数据 public static byte[] decryptDes3CBC(byte[] message, byte[] key){ try { //SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);//密钥32位 // 创建一个密匙工厂,然后用它把DESKeySpec转换成 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); //decrypt // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, iv); // 现在,获取数据并加密 // 正式执行加密操作 byte[] decryptPlainText = cipher.doFinal(message); return decryptPlainText; } catch (Exception e) { e.printStackTrace(); } return null; } public static String byteToHexASICC(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } public static void main(String[] args) throws Exception { // // 添加新安全算法,如果用JCE就要把它添加进去 // //Security.addProvider(new com.sun.crypto.provider.SunJCE()); byte[] key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0".getBytes(); byte[] username = "bj_simsys".getBytes(); ivDes3CBC(key);//一次加解密所用的随机数必须是同一个 // IvParameterSpec iv = new IvParameterSpec("12345678".getBytes()); byte[] encryptPlainText = encryptDes3CBC(username,key); System.out.println("加密_3des_cbc: " + byteToHexASICC(encryptPlainText)); byte[] decryptPlainText = decryptDes3CBC(encryptPlainText,key); System.out.println("解密_3des_cbc: " + new String(decryptPlainText)); } //完整方法 /* public static void main(String[] args) throws Exception { // // 添加新安全算法,如果用JCE就要把它添加进去 // //Security.addProvider(new com.sun.crypto.provider.SunJCE()); byte[] key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0".getBytes(); byte[] username = "bj_simsys".getBytes(); IvParameterSpec iv = null; // SecretKey secretKey = new SecretKeySpec(key, "DESede"); //密钥默认24位 DESedeKeySpec dks = new DESedeKeySpec(key);//密钥32位 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey securekey = keyFactory.generateSecret(dks); // DES算法要求有一个可信任的随机数源 SecureRandom random = new SecureRandom(); byte seed[] = random.generateSeed(8);//调用 generateSeed 方法来生成给定的种子字节数 IvParameterSpec iv = new IvParameterSpec(seed); //encrypt Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, securekey, iv); byte[] encryptedData = cipher.doFinal(username); System.out.println("encrypt_3des_cbc: " + byteToHexString(encryptedData)); //decrypt cipher.init(Cipher.DECRYPT_MODE, securekey, iv); byte[] decryptPlainText = cipher.doFinal(encryptedData); System.out.println("encrypt_3des_cbc22: " + new String(decryptPlainText)); }*/ }DES3ECB.java
package com.dmt.des; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * 3DES加密 * * @author SHANHY(365384722@QQ.COM) * @date 2015-8-18 */ public class DES3ECB { private static final String Algorithm = "DESede"; // 定义 加密算法,可用 // DES,DESede,Blowfish public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } /** * 加密方法 * * @param keybyte * 加密密钥,长度为24字节 * @param src * 被加密的数据缓冲区(源) * @return * @author SHANHY * @date 2015-8-18 */ public static byte[] encryptMode(byte[] keybyte, byte[] src) { try { // 生成密钥 SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); // 加密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 解密 * * @param keybyte * 加密密钥,长度为24字节 * @param src * 加密后的缓冲区 * @return * @author SHANHY * @date 2015-8-18 */ public static byte[] decryptMode(byte[] keybyte, byte[] src) { try { // 生成密钥 SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); // 解密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.DECRYPT_MODE, deskey); return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 转换成十六进制字符串 * * @param b * @return * @author SHANHY * @date 2015-8-18 */ public static String byte2hex(byte[] b) { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; if (n < b.length - 1) hs = hs + ":"; } return hs.toUpperCase(); } /** * 测试 * * @param args * @author SHANHY * @date 2015-8-18 */ public static void main(String[] args) { // 添加新安全算法,如果用JCE就要把它添加进去 //Security.addProvider(new com.sun.crypto.provider.SunJCE()); // 24字节的密钥(我们可以取apk签名的指纹的前12个byte和后12个byte拼接在一起为我们的密钥) //final byte[] keyBytes = { 0x11, 0x22, 0x4F, 0x58, (byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte) 0xE2 }; final String key = "1A2B3C4D5E6F78901234A5B6"; String username = "bj_simsys"; System.out.println("加密前的字符串:" + username); byte[] encoded = encryptMode(key.getBytes(), username.getBytes()); System.out.println("加密后:"+byteToHexString(encoded)); //System.out.println("加密后的字符串:" + new String(encoded)); byte[] srcBytes = decryptMode(key.getBytes(), encoded); System.out.println("解密后的字符串:" + (new String(srcBytes))); } }Des3ECBUtils.java
package com.dmt.des; import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * SecretUtils {3DES加密解密的工具类 } * @author William * @date 2013-04-19 */ public class Des3ECBUtils { //定义加密算法,有DES、DESede(即3DES)、Blowfish private static final String Algorithm = "DESede"; private static final String PASSWORD_CRYPT_KEY = "1A2B3C4D5E6F78901234A5B6C7D8E9F01A2B3C4D5E6F78901234A5B6C7D8E9F01A2B3C4D5E6F78901234A5B6C7D8E9F0"; /** * 加密方法 * @param src 源数据的字节数组 * @return */ public static byte[] encryptMode(byte[] src) { try { SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm); //生成密钥 Cipher c1 = Cipher.getInstance(Algorithm); //实例化负责加密/解密的Cipher工具类 c1.init(Cipher.ENCRYPT_MODE, deskey); //初始化为加密模式 return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 解密函数 * @param src 密文的字节数组 * @return */ public static byte[] decryptMode(byte[] src) { try { SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm); Cipher c = Cipher.getInstance(Algorithm); c.init(Cipher.DECRYPT_MODE, deskey); //初始化为解密模式 return c.doFinal(src); } catch (java.security.NoSuchAlgorithmException e) { e.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e) { e.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /* * 根据字符串生成密钥字节数组 * @param keyStr 密钥字符串 * @return * @throws UnsupportedEncodingException */ public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException{ byte[] key = new byte[24]; //声明一个位的字节数组,默认里面都是0 byte[] temp = keyStr.getBytes("UTF-8"); //将字符串转成字节数组 /* * 执行数组拷贝 * System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位) */ if(key.length > temp.length){ //如果temp不够位,则拷贝temp数组整个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, temp.length); }else{ //如果temp大于位,则拷贝temp数组个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, key.length); } // System.out.println("11=="+byteToHexString(key)); return key; } /** * 功能:将byte[]的字节数组转ASICC码 * @param bytes 字节数组 * @return ASICC码(也是16进制) */ public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } public static void main(String[] args) { String msg = "bj_simsys";//3DES加密解密案例 System.out.println("【加密前】:" + msg); //加密 byte[] secretArr = Des3ECBUtils.encryptMode(msg.getBytes()); // System.out.println("【加密后】:" + new String(secretArr)); System.out.println("加密后:"+byteToHexString(secretArr)); //解密 byte[] myMsgArr = Des3ECBUtils.decryptMode(secretArr); System.out.println("【解密后】:" + new String(myMsgArr)); } }Des3ECBUtils1.java
package com.dmt.des; import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.SecretKeySpec; /** * SecretUtils {3DES加密解密的工具类 } * @author William * @date 2013-04-19 */ public class Des3ECBUtils1 { /** 定义加密算法,有DES、DESede(即3DES)、Blowfish*/ private static final String Algorithm = "DESede"; /** 密钥 */ private static SecretKey securekey; /** * 加密方法 * @param src 源数据的字节数组 * @return */ public static byte[] encryptMode(String enKey, byte[] src) { try { DESedeKeySpec dks = new DESedeKeySpec(enKey.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm); securekey = keyFactory.generateSecret(dks); Cipher c1 = Cipher.getInstance(Algorithm); // 实例化负责加密/解密的Cipher工具类 c1.init(Cipher.ENCRYPT_MODE, securekey); // 初始化为加密模式 return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 解密函数 * @param src 密文的字节数组 * @return */ public static byte[] decryptMode(String enKey, byte[] src) { try { DESedeKeySpec dks = new DESedeKeySpec(enKey.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm); securekey = keyFactory.generateSecret(dks); Cipher c = Cipher.getInstance(Algorithm); c.init(Cipher.DECRYPT_MODE, securekey); // 初始化为解密模式 return c.doFinal(src); } catch (java.security.NoSuchAlgorithmException e) { e.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e) { e.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } /** * 根据字符串生成密钥字节数组 * * @param keyStr * 密钥字符串 * @return * @throws UnsupportedEncodingException */ public static byte[] build3DesKey(String keyStr)throws UnsupportedEncodingException { byte[] key = new byte[24]; // 声明一个位的字节数组,默认里面都是0 byte[] temp = keyStr.getBytes("UTF-8"); // 将字符串转成字节数组 /* * 执行数组拷贝 System.arraycopy(源数组,从源数组哪里开始拷贝,目标数组,拷贝多少位) */ if (key.length > temp.length) { // 如果temp不够位,则拷贝temp数组整个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, temp.length); } else { // 如果temp大于位,则拷贝temp数组个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, key.length); } System.out.println("【十六进制24字节-密钥】:1A2B3C4D5E6F78901234"); // System.out.println("【ASCII-密钥】:"+byteToHexString(key)); return key; } //字节转ASICC码 public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } public static void main(String[] args) { String msg = "bj_simsys";//3DES加密解密案例 String key = "1A2B3C4D5E6F78901234A5B6C7D8E9F0";//3DES加密解密案例 System.out.println("【加密前】:" + msg); //加密 byte[] secretArr = Des3ECBUtils1.encryptMode(key, msg.getBytes()); // System.out.println("【加密后】:" + new String(secretArr)); System.out.println("【加密后】:"+byteToHexString(secretArr)); //解密 byte[] myMsgArr = Des3ECBUtils1.decryptMode(key, secretArr); System.out.println("【解密后】:" + new String(myMsgArr)); } }DESCryptography.java
package com.dmt.des; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; public class DESCryptography { public static void main(String[] args) { // TODO Auto-generated method stub String content="bj_simsys"; String key="01234567"; System.out.println("加密前:"+byteToHexString(content.getBytes())); byte[] encrypted=DES_CBC_Encrypt(content.getBytes(), key.getBytes()); System.out.println("加密后:"+byteToHexString(encrypted)); byte[] decrypted=DES_CBC_Decrypt(encrypted, key.getBytes()); System.out.println("解密后:"+byteToHexString(decrypted)); } public static byte[] DES_CBC_Encrypt(byte[] content, byte[] keyBytes){ try { DESKeySpec keySpec=new DESKeySpec(keyBytes); SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES"); SecretKey key=keyFactory.generateSecret(keySpec); Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey())); byte[] result=cipher.doFinal(content); return result; } catch (Exception e) { // TODO Auto-generated catch block System.out.println("exception:"+e.toString()); } return null; } public static byte[] DES_CBC_Decrypt(byte[] content, byte[] keyBytes){ try { DESKeySpec keySpec=new DESKeySpec(keyBytes); SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("DES"); SecretKey key=keyFactory.generateSecret(keySpec); Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes)); byte[] result=cipher.doFinal(content); return result; } catch (Exception e) { // TODO Auto-generated catch block System.out.println("exception:"+e.toString()); } return null; } /** * 功能:将byte[]的字节数组转ASICC码 * @param bytes 字节数组 * @return ASICC码(也是16进制) */ public static String byteToHexString(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } /* private static byte toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; }*/ }DesStringToAscii.java
package com.dmt.des; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import com.dmt.util.DecrypTool; import dmt3des.Arithmetic; public class DesStringToAscii { private static final byte FIX_BYTE=0x00; private static final int BUFFER_SIZE = 1024; // public void encode(InputStream rawMessage, OutputStream encodedMessage) { // try { // Cipher cipher = Cipher.getInstance(ALGORITHM); // cipher.init(Cipher.ENCRYPT_MODE, this.deskey); // byte[] buffer = new byte[BUFFER_SIZE]; // int size = 0; // while ((size = rawMessage.read(buffer)) != -1) { // if(sizelen-8;i--){ // if(buffer[i]==FIX_BYTE){ // len--; // }else{ // break; // } // } // return len; // } /// private static String toHexUtil(int n){ String rt=""; switch(n){ case 10:rt+="A";break; case 11:rt+="B";break; case 12:rt+="C";break; case 13:rt+="D";break; case 14:rt+="E";break; case 15:rt+="F";break; default: rt+=n; } return rt; } public static String toHex(int n){ StringBuilder sb=new StringBuilder(); if(n/16==0){ return toHexUtil(n); }else{ String t=toHex(n/16); int nn=n%16; sb.append(t).append(toHexUtil(nn)); } return sb.toString(); } public static String parseAscii(String str){ StringBuilder sb=new StringBuilder(); byte[] bs=str.getBytes(); for(int i=0;i Datato.java package com.dmt.des; import java.io.UnsupportedEncodingException; public class Datato { /** * 功能:将byte[]的字节数组转ASICC码 * @param bytes 字节数组 * @return ASICC码(也是16进制) */ public static String byteToHexASICC(byte[] bytes) { StringBuffer sb = new StringBuffer(bytes.length); String sTemp; for (int i = 0; i < bytes.length; i++) { sTemp = Integer.toHexString(0xFF & bytes[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } //111111111111111111111111111111111111111111111 over /** 转换数据 */ private static final char[] HEXDIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; /** * 功能:将byte[]的转换为相应的十六进制字符串 * @param ba 字节数组 * @return 十六进制字符串 */ public static String bytetohex(byte[] ba, int offset, int length) { char[] buf = new char[length * 2]; int j = 0; int k; for (int i = offset; i < offset + length; i++) { k = ba[i]; buf[j++] = HEXDIGITS[(k >>> 4) & 0x0F]; buf[j++] = HEXDIGITS[k & 0x0F]; } return new String(buf); } //22222222222222222222222222222222222222222222222222222222222222 over /** * 功能:将十六进制字符串转换为字节数组 * @param hex 十六进制字符串 * @return 字节数组 */ public static byte[] hextobyte(String hex) { int len = hex.length(); byte[] buf = new byte[(len + 1) / 2]; int i = 0; int j = 0; if ((len % 2) == 1) { buf[j++] = (byte) hexchartoint(hex.charAt(i++)); } while (i < len) { buf[j++] = (byte) ((hexchartoint(hex.charAt(i++)) << 4) | hexchartoint(hex.charAt(i++))); } return buf; } //33333333333333333333333333333333333333333333333333333 over /** * 功能:将十六进制的char转换为十进制的int值 * @param ch 十六进制的char * @return 十进制 int值 */ public static int hexchartoint(char ch) { if (ch >= '0' && ch <= '9') { return ch - '0'; } if (ch >= 'A' && ch <= 'F') { return ch - 'A' + 10; } if (ch >= 'a' && ch <= 'f') { return ch - 'a' + 10; } throw new IllegalArgumentException("invalid hex digit '" + ch + "'"); } //444444444444444444444444444444444444444444444444444444444444 over /** * 功能:字符串转换为十六进制ASCII * @param str 普通字符串,如:bj_simsys * @return 十六进制ASCII */ public static String parseAscii(String str){ StringBuilder sb=new StringBuilder(); byte[] bs=str.getBytes(); for(int i=0;itemp.length) { // 如果temp不够位,则拷贝temp数组整个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, temp.length); } else { // 如果temp大于位,则拷贝temp数组个长度的内容到key数组中 System.arraycopy(temp, 0, key, 0, key.length); } System.out.println("【十六进制24字节-密钥】:1A2B3C4D5E6F78901234"); // System.out.println("【ASCII-密钥】:"+byteToHexString(key)); return key; } //测试 public static void main(String[] args) { final String key = "1A2B3C4D5E6F78901234A5B6"; String username = "bj_simsys"; System.out.println("加密前的字符串:" + username); byte[] encoded = DES3ECB.encryptMode(key.getBytes(), username.getBytes()); System.out.println("加密后:"+DES3ECB.byte2hex(encoded)); } }