加密相关的一些方法

  1. 云栖社区>
  2. 博客>
  3. 正文

加密相关的一些方法

黄威的世界 2016-05-10 13:32:23 浏览966
展开阅读全文

(1)求两个字节数组的异或

Java代码  收藏代码
  1. /*** 
  2.      * 求异或. 
  3.      *  
  4.      * @param strOldHex  : hex string 
  5.      * @param strKeyHex  : hex string 
  6.      * @return 
  7.      */  
  8.     public static byte[] xOR(String strOldHex, String strKeyHex) {  
  9.         byte[] oldBytes = ByteStringUtil.hexString2Bytes(strOldHex);  
  10.         byte[] keyBytes = ByteStringUtil.hexString2Bytes(strKeyHex);  
  11.         byte[] xorResult = new byte[oldBytes.length];  
  12.         int keyIndex = 0;  
  13.         for (int x = 0; x < oldBytes.length; x++) {  
  14.             xorResult[x] = (byte) (oldBytes[x] ^ keyBytes[keyIndex]);  
  15.             if (++keyIndex == keyBytes.length) {  
  16.                 keyIndex = 0;  
  17.             }  
  18.         }  
  19.         return xorResult;  
  20.     }  

 测试如下:

Java代码  收藏代码
  1. @Test  
  2.     public void test_XOR() {  
  3.         String strOldHex = "8080";  
  4.         String strKeyHex = "8182";  
  5.         byte[]xorResult=CustomMACUtil.xOR(strOldHex, strKeyHex);  
  6.           
  7.         System.out.println("---------------");  
  8.         System.out.println(ByteStringUtil.byteArrayToHexString(xorResult));  
  9.     }  

 运行结果:

0102

注意:上述方法的参数是十六进制位串

(2)CBC加密

Java代码  收藏代码
  1. /** 
  2.      * 加密函数 
  3.      *  
  4.      * @param data 
  5.      *            加密数据 
  6.      * @param key 
  7.      *            密钥 
  8.      * @param iv  
  9.      * @return 返回加密后的数据 
  10.      */  
  11.     public static byte[] desCBCEncrypt(byte[] data, byte[] key, byte[] iv) {  
  12.         try {  
  13.             // 从原始密钥数据创建DESKeySpec对象  
  14.             DESKeySpec dks = new DESKeySpec(key);  
  15.   
  16.             // 创建一个密匙工厂,然后用它把DESKeySpec转换成  
  17.             // 一个SecretKey对象  
  18.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  19.             SecretKey secretKey = keyFactory.generateSecret(dks);  
  20.   
  21.             // Cipher对象实际完成加密操作  
  22.             // Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");  
  23.             // 若采用NoPadding模式,data长度必须是8的倍数  
  24.             Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");  
  25.   
  26.             // 用密匙初始化Cipher对象  
  27.             IvParameterSpec param = new IvParameterSpec(iv);  
  28.             cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);  
  29.   
  30.             // 执行加密操作  
  31.             byte encryptedData[] = cipher.doFinal(data);  
  32.   
  33.             return encryptedData;  
  34.         } catch (Exception e) {  
  35.             System.err.println("DES-CBC算法,加密数据出错!");  
  36.             e.printStackTrace();  
  37.         }  
  38.   
  39.         return null;  
  40.     }  

 测试如下:

Java代码  收藏代码
  1. @Test  
  2.     public void test_desCBCEncrypt() {  
  3.         String data2 = "03DA9F790A007A1Fe49309DA148F5c00";  
  4.         String leftHalf = "1b03aa6415bb0a54";  
  5.         byte[] macResultBytes;  
  6.         macResultBytes = DESUtil.desCBCEncrypt(  
  7.                 ByteStringUtil.hexString2Bytes(data2),  
  8.                 ByteStringUtil.hexString2Bytes(leftHalf), new byte[8]);  
  9.         System.out.println(ByteStringUtil.byteArrayToHexString(macResultBytes));  
  10.     }  

 运行结果:

9a3fa1e6957f79dbad799659880af8e6

 注意:上述加密不是普通的DES加密

 

(3)DES3加密

Java代码  收藏代码
  1. // keybyte为加密密钥,长度为24字节  
  2.     // src为被加密的数据缓冲区(源)  
  3.     public static byte[] encryptMode(byte[] src, byte[] keybyte) {  
  4.         try {  
  5.             // 如果加密密钥的长度为16个字节,则把开始的8个字节补到最后变成24个字节  
  6.             if (keybyte.length == 16) {  
  7.                 String newKeybyte = ByteStringUtil.byteArrayToHexString(keybyte);  
  8.                 String newKeybyte1 = newKeybyte + newKeybyte.substring(016);  
  9.                 keybyte = ByteStringUtil.hexString2Bytes(newKeybyte1);  
  10.             }  
  11.             // 生成密钥  
  12.             SecretKey deskey = new SecretKeySpec(keybyte, "DESede");  
  13.             final IvParameterSpec iv = new IvParameterSpec(new byte[8]);  
  14.             // 加密  
  15.             Cipher c1 = Cipher.getInstance("DESede/CBC/PKCS5Padding");  
  16.             c1.init(Cipher.ENCRYPT_MODE, deskey,iv);  
  17.             return c1.doFinal(src);  
  18.         } catch (java.security.NoSuchAlgorithmException e1) {  
  19.             e1.printStackTrace();  
  20.         } catch (javax.crypto.NoSuchPaddingException e2) {  
  21.             e2.printStackTrace();  
  22.         } catch (java.lang.Exception e3) {  
  23.             e3.printStackTrace();  
  24.         }  
  25.         return null;  
  26.     }  

网友评论

登录后评论
0/500
评论
黄威的世界
+ 关注