Javascript 使用PyCryptodome进行AES解密不会产生预期结果

Javascript 使用PyCryptodome进行AES解密不会产生预期结果,javascript,python,encoding,cryptography,aes,Javascript,Python,Encoding,Cryptography,Aes,我在用python复制AES加密和解密时遇到一些困难 上下文:一年前,我创建了一个基于django的小型应用程序,用于客户端加密。基本上,一些用户的输入用密钥加密,并作为十六进制字符串发送以存储 为了便于说明,我将重点介绍bd45bcccd0(也称为用john的密钥加密的“Masha:3ed8bd71327aafd855aac37921519767) 使用当前js库进行加密和解密 加密utf-8->字节->加密字节->十六进制 解密十六进制->加密字节->字节->utf-8 id\u pas

我在用python复制AES加密和解密时遇到一些困难

上下文:一年前,我创建了一个基于django的小型应用程序,用于客户端加密。基本上,一些用户的输入用密钥加密,并作为十六进制字符串发送以存储

为了便于说明,我将重点介绍
bd45bcccd0
(也称为用john的密钥加密的“Masha:
3ed8bd71327aafd855aac37921519767

使用当前js库进行加密和解密
  • 加密utf-8->字节->加密字节->十六进制
  • 解密十六进制->加密字节->字节->utf-8
id\u password
是用户密码的MD5散列。它存储在会话存储器中并用作密钥

函数加密(t){
var key=aesjs.utils.hex.toBytes(sessionStorage.getItem(“id_密码”);
var textBytes=aesjs.utils.utf8.toBytes(t);
var aesCtr=新aesjs.ModeOfOperation.ctr(键);
var encryptedBytes=aesCtr.encrypt(textBytes);
var encryptedHex=aesjs.utils.hex.fromBytes(encryptedBytes);
返回加密十六进制;
}
函数解密(t){
var key=aesjs.utils.hex.toBytes(sessionStorage.getItem(“id_密码”);
var textBytes=aesjs.utils.hex.toBytes(t);
var aesCtr=新aesjs.ModeOfOperation.ctr(键);
var decriptedBytes=aesCtr.decrypt(textBytes);
var decrypted_utf8=aesjs.utils.utf8.fromBytes(decriptedBytes);
返回解密的\u utf8;
}
一旦加载到
,我会得到一个16项数组(因此我猜执行AES 128位CTR):

var key=aesjs.utils.hex.toBytes(sessionStorage.getItem(“id_密码”); console.log(键) 数组(16)[62216189113,50122175216,85170,…] 使用当前代码,加密和解密工作正常

Python实现 出于单元测试的目的,我希望能够解密。我正在使用。为了尽可能模仿客户端,我尝试了以下方法:

john_key=“3ed8bd71327aafd855aac37921519767”
cipher=AES.new(codecs.decode(john_key,'hex_codec'),AES.MODE\u CTR)
d=cipher.decrypt(编解码器.decode('bd45bcccd0','hex_编解码器'))
d、 解码('utf-8')
UnicodeDecodeError:“utf-8”编解码器无法解码位置0中的字节0xac:无效的开始字节
这就是问题所在,但我不确定它发生在哪个阶段。以下是我检查的内容:

#键的长度正确
k=编解码器。解码(john_key,'hex_codec')
K
b'>\xd8\xbdq2z\xaf\xd8U\xaa\xc3y!Q\x97g'
蓝(k)
16
#解码消息的长度是正确的
d=cipher.decrypt(编解码器.decode('bd45bcccd0','hex_编解码器'))
莱恩(d)
5.
因为我不能依赖于一个库,我不能重现结果,我想知道我是否误用了PyCryptodome,或者这个javascript库实现AES CTR加密的方式是否可靠。有什么见解吗

模式需要一个。由于没有显式创建IV,因此将使用隐式创建的IV。但是,这两种代码生成不同的IVs,因此解密失败。在Python代码中,生成随机IV,在aes js代码中使用固定IV(1)

为了能够使用Python代码进行解密,这里必须使用与aes js代码相同的IV(和)。为此目的:

cipher = AES.new(codecs.decode(john_key,'hex_codec'), AES.MODE_CTR)
必须由

counter = Counter.new(128, initial_value = 1)
cipher = AES.new(codecs.decode(john_key,'hex_codec'), AES.MODE_CTR, counter = counter) 
将密文解密给Maria(但不是Masha)



出于安全原因,CTR必须规定密钥/IV对只能使用一次,即如果应用相同的密钥,则必须为每次加密生成新的IV。当前代码的缺点是,当使用同一密钥时,密钥/IV对会重复。更好的方法是为每次加密生成一个随机的IV,将此IV与密文一起发送给收件人(IV不是秘密的,因此通常在密文前加上它),以便用于解密。

我以为IV是用于CBC密码的。对成对使用的评论很好,这显然是一个缺点。我试试你的解决办法。感谢这些有用的东西——试试pyaes——它也是由编写aes js的bit ricmoo写的。我最喜欢的其实是加密技术