前言
最近项目中用到了加密和解密算法,AES、Base64等,借此机会学习下常见的加密和解密算法。
Base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
//Base64加密解密
public static void base64(String str) throws Exception {
byte[] bytes = str.getBytes();
//Base64 加密
String encoded = Base64.encodeBase64String(bytes);
System.out.println("Base 64 加密后:" + encoded);
//Base64 解密
byte[] decoded = Base64.decodeBase64(encoded);
String decodeStr = new String(decoded);
System.out.println("Base 64 解密后:" + decodeStr);
}
AES
AES加密为对称密钥加密,加密和解密都是用同一个解密规则,AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为"状态(state)",因为密钥和加密块要在矩阵上多次的迭代,置换,组合,所以对加密快和密钥的字节数都有一定的要求,AES密钥长度的最少支持为128、192、256,加密块分组长度128位。
AES结合Base64进行加密解密:
/**
* AES 加密
*
* @param
* @param data 待加密内容
* @return 返回Base64转码后的加密数据
*/
public static String encrypt(String data) {
try {
// 创建AES秘钥
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), ALGORITHM);
// 创建密码器
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化加密器
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptByte = cipher.doFinal(data.getBytes(CHARSET_NAME));
// 将加密以后的数据进行 Base64 编码
return Base64.encodeBase64String(encryptByte);
} catch (Exception e) {
log.info("加密异常:{}",e);
return "";
}
}
/**
* AES 解密
*
* 解密的密钥,长度:16 或 32 个字符
* @param base64Data 加密的密文 Base64 字符串
*/
public static String decrypt(String base64Data) {
try {
byte[] data = Base64.decodeBase64(base64Data);
// 创建AES秘钥
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(CHARSET_NAME), AES_NAME);
// 创建密码器
Cipher cipher = Cipher.getInstance(ALGORITHM);
// 初始化解密器
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
// 执行解密操作
byte[] result = cipher.doFinal(data);
return new String(result, CHARSET_NAME);
} catch (Exception e) {
log.info("解密异常:{}", e);
return "";
}
}