加密相关的一些方法

简介:

(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.     }  
相关文章
|
1月前
|
安全 API 开发工具
oss加密的配置方法
阿里云OSS提供多种加密选项:SSE-OSS(默认或对象级AES-256加密)、SSE-KMS(使用KMS托管CMK)、临时密钥加密和客户端加密(CSE)。可通过控制台或API设置Bucket策略,使用HTTP头部指定加密方式。KMS和临时密钥可能涉及更复杂的密钥管理和权限配置。
132 5
|
4月前
|
存储 数据挖掘 数据安全/隐私保护
11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题(上)
11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题
78 1
|
4月前
|
存储 算法 Java
11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题(下)
11.Java方法的综合练习题大全-双色球彩票系统,数字的加密和解密等试题(上)
80 1
|
6月前
|
数据安全/隐私保护 Python
Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)
Python hashlib 加密方法(MD5、SHA1、SHA256、SHA52)
|
3月前
|
安全 Java 数据安全/隐私保护
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
70 0
|
3月前
|
存储 算法 前端开发
面试官:你能说说常见的前端加密方法吗?
面试官:你能说说常见的前端加密方法吗?
174 0
|
4月前
|
数据采集 前端开发 算法
前端加密的常见场景和方法
前端加密的常见场景和方法
|
6月前
|
安全 API 网络安全
api接口为什么需要加密,PHP接口加密的方法有哪些
api接口为什么需要加密,PHP接口加密的方法有哪些
|
8月前
|
算法 数据安全/隐私保护
国家专用加密数据传输之rsa,3des加密方法
国家专用加密数据传输之rsa,3des加密方法
81 0
|
8月前
|
算法 安全 网络安全
PHPGET请求的加密方法简介
在Web开发中,经常会使用GET请求来获取远程服务器上的数据。然而,GET请求的数据通过URL传递,容易被拦截者获取并窃取其中的敏感信息。为了解决这个问题,我们可以采用加密方法来保护数据的安全性。
64 0