Java 使用AES/CBC/PKCS7Padding 加解密字符串

来源:互联网 发布:wifi怎么绑定mac地址 编辑:程序博客网 时间:2024/05/16 20:01

介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别
 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现

所以需要一个jar 来支持。bcprov-jdk16-139.jar

下载地址:http://www.bouncycastle.org/archive/139/bcprov-jdk16-139.jar

废话不说了,下面上代码

加解密类

/** *  * @author ngh * AES128 算法 *  * CBC 模式 *  * PKCS7Padding 填充模式 *  * CBC模式需要添加一个参数iv *  * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别 * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现 */public class AES { // 算法名称 final String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 final String algorithmStr = "AES/CBC/PKCS7Padding"; // private Key key; private Cipher cipher; boolean isInited = false; byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 }; public void init(byte[] keyBytes) {    // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要  int base = 16;  if (keyBytes.length % base != 0) {   int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);   byte[] temp = new byte[groups * base];   Arrays.fill(temp, (byte) 0);   System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);   keyBytes = temp;  }  // 初始化  Security.addProvider(new BouncyCastleProvider());  // 转化成JAVA的密钥格式  key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);  try {   // 初始化cipher   cipher = Cipher.getInstance(algorithmStr, "BC");  } catch (NoSuchAlgorithmException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchPaddingException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchProviderException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } /**  * 加密方法  *   * @param content  *            要加密的字符串  * @param keyBytes  *            加密密钥  * @return  */ public byte[] encrypt(byte[] content, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(content);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; } /**  * 解密方法  *   * @param encryptedData  *            要解密的字符串  * @param keyBytes  *            解密密钥  * @return  */ public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(encryptedData);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; }}

测试类

public class Test { public static void main(String[] args) {  AES aes = new AES();//   加解密 密钥  byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };  String content = "1";  // 加密字符串  System.out.println("加密前的:" + content);  System.out.println("加密密钥:" + new String(keybytes));  // 加密方法  byte[] enc = aes.encrypt(content.getBytes(), keybytes);  System.out.println("加密后的内容:" + new String(Hex.encode(enc)));  // 解密方法  byte[] dec = aes.decrypt(enc, keybytes);  System.out.println("解密后的内容:" + new String(dec)); } }

测试结果:

加密前的:1
加密密钥:12345678
IV:0102030405060708
加密后的内容:b59227d86200d7fedfb8418a59a8eea9
IV:0102030405060708
解密后的内容:1

0 0
原创粉丝点击