记录前后端接口使用AES+RSA混合加解密
在实现AES+RSA混合加密时,前端使用AES密钥对数据进行加密,并使用RSA公钥对AES密钥进行加密。后端使用RSA私钥解密得到AES密钥,再使用AES密钥解密获取数据。
以下是使用Python实现的前后端混合加密解密的简化示例:
前端(JavaScript):
// 引入CryptoJS库
// 生成AES密钥和IV
function generateAESKeyAndIV() {
let aesKey = CryptoJS.lib.WordArray.random(16);
let iv = CryptoJS.lib.WordArray.random(16);
return { aesKey, iv };
}
// 使用AES密钥和IV加密数据
function encryptDataWithAES(data, aesKey, iv) {
return CryptoJS.AES.encrypt(data, aesKey, { iv });
}
// 使用RSA公钥加密AES密钥
function encryptAESKeyWithRSA(aesKey, publicKey) {
return CryptoJS.RSA.encrypt(aesKey, publicKey);
}
// 示例:
const publicKey = "-----BEGIN PUBLIC KEY-----..."; // 从文件或服务器获取RSA公钥
const dataToEncrypt = "secret data";
const { aesKey, iv } = generateAESKeyAndIV();
const encryptedAESKey = encryptAESKeyWithRSA(aesKey, publicKey);
const encryptedData = encryptDataWithAES(dataToEncrypt, aesKey, iv);
// 发送加密后的数据到后端
console.log(encryptedAESKey);
console.log(encryptedData);
后端(Python):
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
# 加载RSA私钥
private_key = """-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----"""
def decryptAESKeyWithRSA(encrypted_aes_key, private_key):
rsa_private_key = RSA.importKey(private_key)
aes_key = rsa_private_key.decrypt(encrypted_aes_key)
return aes_key
def decryptDataWithAES(encrypted_data, aes_key, iv):
cipher = AES.new(aes_key, AES.MODE_CBC, iv)
return cipher.decrypt(encrypted_data)
# 示例:
encrypted_aes_key = b'...' # 接收前端发送的加密后的AES密钥
encrypted_data = b'...' # 接收前端发送的加密后的数据
iv = b'...' # 接收前端发送的初始化向量
decrypted_aes_key = decryptAESKeyWithRSA(encrypted_aes_key, private_key)
decrypted_data = decryptDataWithAES(encrypted_data, decrypted_aes_key, iv)
print(decrypted_data) # 输出解密后的数据
请确保在实际部署时使用真实的RSA公钥和私钥,以及处理好随机数生成、加密数据的格式转换等问题。
评论已关闭