使用 AES GCM 在 JS 前端加密并在 python 后端解密

问题描述

我正在尝试使用 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端解密。但我收到以下错误:

enter image description here

如果我尝试在两边加密相同的字符串,我会得到以下输出: 在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 (将#修改为@)