1.AES简介
高级加密标准(AES,Advanced Encryption Standard),是最常见的对称加密算法,对称加密是指加密和解密使用相同的密钥,加密解密过程如下:
2.在Android中使用AES
AES共有5种加密模式:
- ECB模式(电码本模式)
- CBC模式(密码分组链接模式)
- CTR(计算器模式)
- CFB(密码反馈模式)
- OFB(输出反馈模式)
比较常用的是ECB和CBC模式,除密钥外,CBC模式可额外传入一个偏移量(iv值)进行加密,增强了加密算法强度。
Android中已内置了AES加解密支持,示例代码如下:
- AES加密
/**
* AES加密,返回BASE64编码后的加密字符串
*
* @param sSrc -- 待加密内容
* @param encodingFormat -- 字符串编码方式
* @param algorithm -- 使用的算法 算法/模式/补码方式, 目前支持ECB和CBC模式
* @param sKey -- 加密密钥
* @param ivParameter -- 偏移量,CBC模式时需要
* @return Base64编码后的字符串
* @throws Exception
*/
public static String aesEncrypt(String sSrc, String encodingFormat, String algorithm, String sKey, String ivParameter) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
byte[] raw = sKey.getBytes(encodingFormat);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
//使用CBC模式,需要一个向量iv,可增加加密算法的强度
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(encodingFormat));
if (algorithm.contains("CBC")) {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
} else {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
}
byte[] encrypted = cipher.doFinal(sSrc.getBytes(encodingFormat));
//此处使用BASE64做转码。
return EnDecryptionUtil.base64Encode(encrypted);
}
- AES解密
/**
* AES解密
* @param sSrc -- 待解密Base64字符串
* @param encodingFormat -- 字符串编码方式
* @param algorithm -- 使用的算法 算法/模式/补码方式, 目前支持ECB和CBC模式
* @param sKey -- 加密密钥
* @param ivParameter -- 偏移量,CBC模式时需要
* @return 解密后的字符串
* @throws Exception
*/
public static String aesDecrypt(String sSrc, String encodingFormat, String algorithm, String sKey, String ivParameter) throws Exception {
byte[] raw = sKey.getBytes(encodingFormat);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance(algorithm);
IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes(encodingFormat));
if (algorithm.contains("CBC")) {
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
} else {//ECB模式
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
}
//先用base64解密
byte[] encrypted1 = EnDecryptionUtil.base64Decode(sSrc);
byte[] original = cipher.doFinal(encrypted1);
return new String(original, encodingFormat);
}
3.示例
加密内容为"123456",密钥为“1234567812345678”,偏移量为“1234567812345678”,加解密方式选择“AES/CBC/PKCS5Padding”,调用结果如下:
使用相同的输入参数进行解密,调用结果如下:
另外,还可以在网站在线AES加密解密进行验证
参考资料
AES加密算法的详细介绍与实现