一、前言
APP安全(二)-客户端使用c、c++实现AES加解密)介绍了客户单实现对数据的加密。但我们客户端通常是需要和服务端交互,提交数据和获取数据,因此服务端也同样需要根据客户端的加解密原理实现同样的加解密算法。上篇文章有对AES加解密的介绍,因此我用Java按照相应的规则实现即可。
二、具体实现
java端的实现相对比较简单,使用java api即可满足要求,可参考一下代码
public class AesUtil {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String IV = "123456789abcdefg";
/**
* encrypt data
* @param key
* @param data
* @return
* @throws SecException
*/
public static String encrypt(String key,String data) throws SecException {
String str;
try {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] ret = cipher.doFinal(data.getBytes(Constants.CHARSET));
str = Base64.encode(ret);
} catch (Exception e) {
throw new SecException(SecExceptionCode.ERROR_UNKNOWN_ERROR, e.getCause());
}
return str;
}
/**
* decrypt data
* @param key
* @param data
* @return
* @throws SecException
*/
public static String decrypt(String key, String data) throws SecException {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM);
try {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] retByte = cipher.doFinal(Base64.decode(data));
return new String(retByte,Constants.CHARSET);
} catch (Exception e) {
throw new SecException(SecExceptionCode.ERROR_UNKNOWN_ERROR, e.getCause());
}
}
三、总结
基于Java的AES实现相对简单,调用现有的API接口满足,我们只需要满足向量、secret key的与app的一致既可以完成加解密。