问题描述
我正在尝试使用 AES GCM 加密算法在 JS 前端加密并在 python 后端解密。我将 Web cryptography api 用于 JS 前端,将 python cryptography library 用于 Python 后端作为加密库。我现在已经在两侧固定了 IV。我在双方都实现了加密解密代码,他们在每一方工作。但我认为填充的方式不同,似乎无法弄清楚在网络密码学 api 中填充是如何完成的。下面是python后端的加解密:
def encrypt(derived_key,secret):
IV = bytes("ddfbccae-b4c4-11",encoding="utf-8")
aes = Cipher(algorithms.AES(derived_key),modes.GCM(IV))
encryptor = aes.encryptor()
padder = padding.PKCS7(128).padder()
padded_data = padder.update(secret.encode()) + padder.finalize()
return encryptor.update(padded_data) + encryptor.finalize()
def decrypt(derived_key,secret):
IV = bytes("ddfbccae-b4c4-11",modes.GCM(IV))
decryptor = aes.decryptor()
decrypted_data = decryptor.update(secret)
unpadder = padding.PKCS7(128).unpadder()
return unpadder.update(decrypted_data) + unpadder.finalize()
这里是加解密代码的JS代码:
async function encrypt(secretKey,message) {
let iv = "ddfbccae-b4c4-11";
iv = Uint8Array.from(iv,x => x.charCodeAt(0))
let encoded = getMessageEncoding(message);
ciphertext = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",iv: iv
},secretKey,encoded
);
return ciphertext;
}
async function decrypt(secretKey,cipherText) {
iv = "ddfbccae-b4c4-11";
iv = Uint8Array.from(iv,x => x.charCodeAt(0))
try {
let decrypted = await window.crypto.subtle.decrypt(
{
name: "AES-GCM",iv: iv
},cipherText
);
let dec = new TextDecoder();
console.log("Decrypted message: ");
console.log(dec.decode(decrypted));
} catch (e) {
console.log("error");
}
}
我尝试在JS端加密并在python端解密。但我收到以下错误:
如果我尝试在两边加密相同的字符串,我会得到以下输出: 在python中加密的文本:\x17O\xadn\x11*I\x94\x99\xc6\x90\x8a\xa9\x9cc=
JS中的密文:\x17O\xadn\x11*I\xdf\xe3F\x81(\x15\xcc\x8c^z\xdf+\x1d\x91K\xbc
如何解决这个填充问题?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)