加密相关的一些方法
(1)求两个字节数组的异或
/*** * 求异或. * * @param strOldHex : hex string * @param strKeyHex : hex string * @return */public static byte[] xOR(String strOldHex, String strKeyHex) {byte[] oldBytes = ByteStringUtil.hexString2Bytes(strOldHex);byte[] keyBytes = ByteStringUtil.hexString2Bytes(strKeyHex);byte[] xorResult = new byte[oldBytes.length];int keyIndex = 0;for (int x = 0; x < oldBytes.length; x++) {xorResult[x] = (byte) (oldBytes[x] ^ keyBytes[keyIndex]);if (++keyIndex == keyBytes.length) {keyIndex = 0;}}return xorResult;}
?测试如下:
@Testpublic void test_XOR() {String strOldHex = "8080";String strKeyHex = "8182";byte[]xorResult=CustomMACUtil.xOR(strOldHex, strKeyHex);System.out.println("---------------");System.out.println(ByteStringUtil.byteArrayToHexString(xorResult));}
?运行结果:
0102
注意:上述方法的参数是十六进制位串
(2)CBC加密
/** * 加密函数 * * @param data * 加密数据 * @param key * 密钥 * @param iv * @return 返回加密后的数据 */public static byte[] desCBCEncrypt(byte[] data, byte[] key, byte[] iv) {try {// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密匙工厂,然后用它把DESKeySpec转换成// 一个SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey secretKey = keyFactory.generateSecret(dks);// Cipher对象实际完成加密操作// Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");// 若采用NoPadding模式,data长度必须是8的倍数Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");// 用密匙初始化Cipher对象IvParameterSpec param = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);// 执行加密操作byte encryptedData[] = cipher.doFinal(data);return encryptedData;} catch (Exception e) {System.err.println("DES-CBC算法,加密数据出错!");e.printStackTrace();}return null;}
?测试如下:
@Testpublic void test_desCBCEncrypt() {String data2 = "03DA9F790A007A1Fe49309DA148F5c00";String leftHalf = "1b03aa6415bb0a54";byte[] macResultBytes;macResultBytes = DESUtil.desCBCEncrypt(ByteStringUtil.hexString2Bytes(data2),ByteStringUtil.hexString2Bytes(leftHalf), new byte[8]);System.out.println(ByteStringUtil.byteArrayToHexString(macResultBytes));}
?运行结果:
9a3fa1e6957f79dbad799659880af8e6
?注意:上述加密不是普通的DES加密
?
(3)DES3加密
// keybyte为加密密钥,长度为24字节// src为被加密的数据缓冲区(源)public static byte[] encryptMode(byte[] src, byte[] keybyte) {try {// 如果加密密钥的长度为16个字节,则把开始的8个字节补到最后变成24个字节if (keybyte.length == 16) {String newKeybyte = ByteStringUtil.byteArrayToHexString(keybyte);String newKeybyte1 = newKeybyte + newKeybyte.substring(0, 16);keybyte = ByteStringUtil.hexString2Bytes(newKeybyte1);}// 生成密钥SecretKey deskey = new SecretKeySpec(keybyte, "DESede");final IvParameterSpec iv = new IvParameterSpec(new byte[8]);// 加密Cipher c1 = Cipher.getInstance("DESede/CBC/PKCS5Padding");c1.init(Cipher.ENCRYPT_MODE, deskey,iv);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;}
?