背景
由于项目需要,要对一些敏感数据进行对称加密、解密,因此在多种加密方式中,选择使用轻便高效的AES算法实现。
加密算法参数
- 加密模式:ECB
- 填充方式:PKCS5
- 数据块大小:128位
- 密码长度:16或32位
- 偏移量:默认
- 输出:Base64
- 字符集:UTF-8
前端Node.js实现
import CryptoJS from 'crypto-js'
/**
* 加密
* @param text 明文字符串
* @param secretKey 密钥
* @returns {string} 加密结果
*/
function Encrypt(text, secretKey) {
let key = CryptoJS.enc.Utf8.parse(secretKey);
let srcs = CryptoJS.enc.Utf8.parse(text);
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
/**
* 解密
* @param encryptStr 密文
* @param secretKey 密钥
* @returns {string} 明文
*/
function Decrypt(encryptStr, secretKey) {
let key = CryptoJS.enc.Utf8.parse(secretKey);
let decrypt = CryptoJS.AES.decrypt(encryptStr, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
//密钥16位或32位才可以
let secretKey = 'abcdefg123456789';
let text = 'apple啊';
let encrypt = Encrypt(text, secretKey);
let decrypt = Decrypt(encrypt, secretKey);
console.log('加密:' + encrypt);
console.log('解密:' + decrypt);
后端Java实现
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AesEncrypt {
/**
* AES解密
*
* @param encryptStr 密文
* @param decryptKey 密钥,必须为16或32位字符组成
* @return 明文
*
*/
public String decrypt(String encryptStr, String decryptKey) {
try {
byte[] encryptByte = Base64.getDecoder().decode(encryptStr);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptByte);
String decryptStr = new String(decryptBytes);
return decryptStr;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* AES加密
*
* @param content 明文
* @param encryptKey 密钥
* @return 密文
*
*/
public String encryptByAES(String content, String encryptKey) {
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
byte[] bytes = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
String encryptStr = Base64.getEncoder().encodeToString(bytes);
return encryptStr;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String text = "aaa";
String encryptKey = "abcdefg123456789";
String encryptStr = encryptByAES(text, encryptKey);
System.out.println("加密:" + encryptStr);
String decryptStr = decryptByAES(encryptStr, encryptKey);
System.out.println("解密:" + decryptStr);
}
}
后端Python实现
安装依赖包:pip3 install aes-pkcs5
from aes_pkcs5.algorithms.aes_ecb_pkcs5_padding import AESECBPKCS5Padding
def encrypt(text: str, key: str):
cipher = AESECBPKCS5Padding(key, "b64")
encrypted = cipher.encrypt(text)
return encrypted
def decrypt(encrypted: str, key: str):
cipher = AESECBPKCS5Padding(key, "b64")
text = cipher.decrypt(encrypted)
return text
secretkey = 'abcdefg123456789'
encrypted_text = encrypt("aaa", secretkey)
print("加密:", encrypted_text)
decrypted_text = decrypt(encrypted_text, secretkey)
print("解密:", decrypted_text)