使用Node.js AES点击encryption并使用PyCrypto进行解密

好吧,所以基本上我有问题与Python解密。

我设法使用Node.jsencryption/解密数据 – 使用“aes-128-ctr”,PyCrypto也是如此,但是当我尝试使用Node.js进行encryption并使用Python进行解密时,我得到的解密文本无效。

Node.js代码:

var key = "1234567890123456"; var cipher = crypto.createCipher("aes-128-ctr",key) var ctext = cipher.update('asasasa','utf8','hex') + cipher.final('hex') console.log(ctext) // outputs: "f2cf6ecd8f" 

Python代码:

 counter = Counter.new(128) cipher = AES.new("1234567890123456", AES.MODE_CTR, counter=counter) cipher.decrypt("f2cf6ecd8f") // outputs: weird encoding characters 

顺便说一下,我并不在乎这种encryption的安全级别,我更关心性能。

crypto.createCipher需要一个密码,EVP_BytesToKey派生一个密钥和IV,但pycrypto直接期待一个密钥和IV。 你需要使用完全相同的程序。

crypto.createCipher决不能用于CTR模式,因为密钥和IV代不是随机的。 由于CTR模式是一种stream模式,因此它将始终产生相同的密钥stream,这可能使攻击者只能观察到使用相同密码encryption的多个密文来推导明文。 这是可能的,因为由此产生的多次垫的问题。

如果你必须使用CTR模式,那么你必须使用crypto.createCipheriv 。 如果使用相同的密钥,则每次都必须使用不同的IV。 这就是为什么这被称为CTR模式的随机数。 对于AES-CTR,96位的随机数是安全性和可能可encryption的明文大小之间的一个很好的折衷。

 var key = "1234567890123456" var iv = Buffer.concat([crypto.randomBytes(12), Buffer.alloc(4, 0)]) var cipher = crypto.createCipheriv("aes-128-ctr", key, iv) var ctext = iv.toString('hex') + cipher.update('asasasa','utf8','hex') + cipher.final('hex') console.log(ctext) 

示例输出:

 5b88aeb265712b6c8bfa8dbd0000000063012d1e52eb42

IV并不是秘密,你必须在解密时使用完全相同的IV。 通常情况下,它与密文一起被加上前缀。 然后在解密之前将其切掉:

 ct = codecs.decode('5b88aeb265712b6c8bfa8dbd0000000063012d1e52eb42', 'hex') # I'm using Python 3 counter = Counter.new(32, prefix=ct[:12], initial_value=0) cipher = AES.new("1234567890123456", AES.MODE_CTR, counter=counter) cipher.decrypt(ct[16:]) 

输出:

 b'asasasa' 

请记住,一个关键需要随机select。 您可以生成一个随机密钥,并将其保存在源代码中的编码forms(即hex)。 如果你这样做,你不能把源代码或字节码给任何你不信任密钥的人。