从 Nodejs 加密时,在 Python 中解密 AES-256-CTR 有效负载



我在 Nodejs 中编写了一个使用 AES-256-CTR 加密用户密码的应用程序:

const crypto = require('crypto')
const masterkey = 'azertyuiopazertyuiopazertyuiopaz'
const cipher = crypto.createCipher('aes-256-ctr', masterkey)
console.log(cipher.update('antoine', 'utf8', 'hex') + cipher.final('hex')) //=> 6415bc70ad76c6

然后它被持久化到数据库中,现在我尝试使用 PyCrypto 从 Python 脚本中破译它,如下所示:

masterkey = 'azertyuiopazertyuiopazertyuiopaz'
password = '6415bc70ad76c6'
from Crypto.Cipher import AES
import os
import binascii
counter = os.urandom(16)
# counter = bytes(16) # does not work
# counter = masterkey[0:16].encode() # does not work
cipher = AES.new(masterkey, AES.MODE_CTR, counter=lambda: counter)
print(cipher.decrypt(binascii.a2b_hex(password)))

但它在这里给了我完全错误的结果。

你知道我错过了什么吗?

编辑

多亏了zaph,我的Javascript代码加密数据的方式似乎不安全。我仍然需要弄清楚 Node 在内部使用什么 IV。我尝试了很多都没有成功

masterkey[0:16].encode()
bytes(16)

根据问题中的新信息进行更新:最好的选择是 Nodejs 使用的是默认计数器值。

加密和解密必须使用相同的计数器值。但是加密时没有提供计数器值,解密时会使用随机值,因此它永远无法工作。

使用:crypto.createCipheriv(algorithm, key, iv)其中iv是随机计数器初始值。

有必要在加密时创建一个随机计数器值并保存它,以便可以在解密时使用相同的初始计数器值。一种选择是在加密数据前面加上计数器值,它不需要是机密的。然后在解密时,它可以从加密数据中分离出来并使用。

此外,使用 CTR 模式时,不得使用相同的键再次使用相同的初始计数器值。

查看点击率模式

PyCrypto文档点击模式:

MODE_CBC
密码块链接 (CBC(。每个密文块都取决于当前和所有以前的明文块。初始化向量 (IV( 是必需的

IV是传输到接收器的数据块。IV可以公开,但必须由接收者进行身份验证,并且应该随机选择。

IV 是初始计数器值。

[Nodejs dociumewnrtation: Class: Cipher:

crypto.createCipheriv(algorithm, key, iv)
algorithm <string>  
key <string> | <Buffer> | <TypedArray> | <DataView>
iv <string> | <Buffer> | <TypedArray> | <DataView>

创建并返回一个 Cipher 对象,其中包含给定的算法、密钥和初始化向量 (iv(。

最新更新