我们项目的需求是IOS前台进行数据加密,java后台进行数据解密,采用对称加密算法。权衡利弊后选用AES加密算法。在实现的过程中发现IOS加密的数据java端解密不了,翻阅资料发现是IOS端ASE的填充算法采用PKCS7Padding,而我在java端采用的填充算法是PKCS5Padding或者NONE,继续查阅资料终于找到JAVA端可用的基于PACS7Padding的加解密算法,自己改造了一下发布如下:
注意两点:
1, 加解密用到了bouncycastle的jar,附件里面有下载
2,用附件中的local_policy.jar,US_export_policy.jar覆盖JDK安装路径的\jre\lib\security(例如我的目录结构为C:\Program Files\Java\jdk1.6.0_43\jre\lib\security,别弄错目录了)目录下的两个jar
package com.ys.dk.common.util;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.encoders.Base64;
public class AESUtil {
/**
* 密钥算法 java6支持56位密钥,bouncycastle支持64位
* */
public static final String KEY_ALGORITHM = "AES";
public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding";
//key长度为[128bit(16byte),192bit(24byte),256bit(32byte)]中的一个
public static final String KEY = "1234567890123456";
public static final SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
/**
* 加密数据
* @param str
* @return String 加密后的数据
* */
public static String encrypt(String str) throws Exception {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 执行操作
byte[] data = cipher.doFinal(str.getBytes());
data = Base64.encode(data);
return new String(data,"UTF-8");
}
/**
* 解密数据
*
* @param str
* @return String 解密后的数据
* */
public static String decrypt(String str) throws Exception {
byte[] data = Base64.decode(str);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 执行操作
return new String(cipher.doFinal(data),"UTF-8");
}
public static void main(String[] args) throws Exception {
String str = "你好";
System.out.println("原始串:"+str);
String enc = AESUtil.encrypt(str);
// enc= "llQCl2Zii01ora9J3PJxNA==";
System.out.println("加密后:"+enc);
String dec = AESUtil.decrypt(enc);
System.out.println("解密后:"+dec);
}
}
注意两点:
1, 加解密用到了bouncycastle的jar,附件里面有下载
2,用附件中的local_policy.jar,US_export_policy.jar覆盖JDK安装路径的\jre\lib\security(例如我的目录结构为C:\Program Files\Java\jdk1.6.0_43\jre\lib\security,别弄错目录了)目录下的两个jar