1、简介
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥。
对称加密算法
加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。
密钥K
用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。
AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
2、使用
AES加解工具包:
public class AESUtils {
/**
* AES加密
* @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的byte[]
*/
public static byte[] aesEncryptToBytes(String content, String encryptKey)
throws Exception {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(encryptKey.getBytes("UTF-8"));
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, secureRandom);
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(kgen.generateKey()
.getEncoded(), "AES"));
return cipher.doFinal(content.getBytes("UTF-8"));
}
/**
* AES加密为base64字符串
* @param content待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的base64字符串
*/
public static String aesEncrypt(String content, String encryptKey)
throws Exception {
return Base64
.encodeBase64String(aesEncryptToBytes(content, encryptKey));
}
/**
* AES解密
* @param encryptBytes 待解密的byte[]
* @param decryptKey 解密密钥
* @return 解密后的字符串
*/
public static String aesDecryptByBytes(byte[] encryptBytes,
String decryptKey) throws Exception {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(decryptKey.getBytes("UTF-8"));
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, secureRandom);
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(kgen.generateKey()
.getEncoded(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes);
}
/**
* 将base64字符串用AES解密
* @param encryptStr 待解密的base64字符串
* @param decryptKey 解密密钥
* @return 解密后的字符串
*/
public static String aesDecrypt(String encryptStr, String decryptKey)
throws Exception {
return StringUtils.isBlank(encryptStr) ? null : aesDecryptByBytes(
Base64.decodeBase64(encryptStr), decryptKey);
}
}
项目中使用
// 加密 密码+设备sn号
AESUtils.aesEncrypt(password,devSn);
//解密
AESUtils.aesDecrypt(form.getPassword(),form.getDevSn());