gpt4 book ai didi

python - NodeJS AES 加密 Python 解密

转载 作者:行者123 更新时间:2023-12-01 07:41:18 25 4
gpt4 key购买 nike

我有一个nodejs服务,它对一些需要在Python中解密的数据使用AES加密。无论我做什么,我都无法使其发挥作用。NodeJS代码:

const algorithm = 'aes-128-ctr';

function encryptScript(data, key) {
const cipher = crypto.createCipher(algorithm, key);

let crypted = cipher.update(data, 'utf8', 'hex');
crypted += cipher.final('hex');

return crypted;
}

我在Python中尝试过:

counter = Counter.new(128)
cipher = AES.new(key, AES.MODE_CTR, counter=counter)
print cipher.decrypt(enc.decode("hex"))

但是它不起作用。

我的第一个问题是 Python 代码不接受长度超过 32 个字节的键(而 Nodejs 代码接受)。

如果我使用 NodeJS 加密模块,解密工作正常:

function decryptScript(data, key) {
const decipher = crypto.createDecipher(algorithm, key);
let dec = decipher.update(data, 'hex', 'utf8');
dec += decipher.final('utf8');
return dec;
}

我不知道 Node 在做什么,但它可能与数据的某些填充有关。

我怎样才能让它发挥作用?

(我更喜欢不需要更改 NodeJS 代码而只需要更改 Python 脚本的解决方案)。

最佳答案

  • CreateCipher 使用 EVP_BytesToKey 从密码创建 key 和 IV(NodeJS 代码中所谓的 key 实际上是密码)。 HereEVP_BytesToKey 在 Python 中的实现。 CreateCipher 的文档中描述了要使用的参数:MD5,无盐,一次迭代。在 CTR-mode 中,IV 通常随着每个以要定义的值开始的 block 递增。 CreateCipher 使用通过 EVP_BytesToKey 确定的 IV 作为起始值。因此,CreateCipher 的功能可以在 Python 中实现,如下所示:

    import hashlib
    from Crypto.Cipher import AES
    from Crypto.Util import Counter

    ...

    encrypted = '5e99b5190f12143c057f6bdd8625f958682e737c11e138a2f571c050313dbe1008347604c7c7e8bf506a0a' # Example

    # Generate key and iv
    keySize = 16
    ivSize = 16
    digest = hashlib.md5
    salt = b''
    password = b'123456' # Example
    iteration = 1
    keyiv = EVP_BytesToKey(keySize, ivSize, digest, salt, password, iteration)
    key = keyiv[0]
    iv = keyiv[1]

    # Define counter
    nbits = 128
    initial_value = int.from_bytes(iv, byteorder = 'big');
    counter = Counter.new(nbits, initial_value = initial_value)

    # Decrypt
    cipher = AES.new(key, AES.MODE_CTR, counter = counter)
    decrypted = cipher.decrypt(bytes.fromhex(encrypted))
    print("Decrypted: " + decrypted.decode('utf8'))

    密文是使用以下输入通过 NodeJS 代码生成的:

    key = '123456';
    data = 'The quick brown fox jumps over the lazy dog';
  • 请注意,CreateCipher 已弃用,不应再使用,尤其是不要与 CTR 模式结合使用。相反,可以使用 CreateCipheriv。在 CTR 模式中,重要的是 key /IV 对仅使用一次。否则安全性将会丢失,请参阅 here 。 CreateCipher 不提供随机化,即相同的密码始终生成相同的 key 和 IV,因此始终生成相同的 key 流。因此,如果多次使用相同的密码,就会失去安全性。另一方面,CreateCipheriv 需要一个 key 和一个随机 IV。这里可以有一个键只要 IV 的随机化确保键/值对不重复,就可以多次使用,请参阅 here

关于python - NodeJS AES 加密 Python 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com