gpt4 book ai didi

python - 将 Python AES 转换为 Node

转载 作者:行者123 更新时间:2023-11-30 21:53:40 25 4
gpt4 key购买 nike

我无法在 Python 中获取现有的遗留代码来像 NodeJS 一样进行加密/解密。我确实正确解码了前 16 个字符。

这是Python代码:

from Crypto.Cipher import AES
counter = b'HOJFKGQMRCTKUQHP'
cipher = AES.new(self.symmetric_key, AES.MODE_CTR, counter=lambda: counter)
encrypted = cipher.encrypt(data)

我发现每次迭代都使用相同的计数器的来源: PyCrypto problem using AES+CTR

在 NodeJS (ts-node) 中仅对前 16 个字符起作用的是:

import { createDecipheriv, Decipher } from 'crypto'
const decrypt = (inputBase64: string): string => {
const algorithm = 'aes-192-ctr'; // 24 byte key, 16 byte "counter"
var decipher: Decipher = createDecipheriv(algorithm, key, counter /* yes, it's an iv */)
// decipher.setAutoPadding(false);

return decipher.update(inputBase64, 'base64', 'utf8') + decipher.final('utf8');
}

我找到了各种在线资源,它们都增加了计数器 - 有没有办法使用内置的 Node 加密库来控制计数器增量?我发现了一些我可以覆盖的在线实现(如果发生这种情况): https://github.com/ricmoo/aes-js/blob/master/index.js#L656 https://github.com/brix/crypto-js/blob/develop/src/mode-ctr.js#L26

如何让它在 Node 中工作?我的 python 代码(这是遗留的,如果不迁移现有值就无法更改)具有以下输出:

encrypt('Testing--StackOverflow')
# outputs: 'r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ=='

使用上述解密函数从 Node :

const key = 'LKOXBRRUNBOSMENKEPPZUKWB';
const counter = 'HOJFKGQMRCTKUQHP';
const encrypted = 'r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ==';
const clearText = decrypt(encrypted);
console.log('clear text:', clearText)
// outputs: clear text: Testing--StackOv�::��m

希望有人可以在这里分享一些见解!

最佳答案

CTR 模式的本质是计数器的递增,这就是为什么该模式实际上称为计数器模式 [1] 。由于在 Python 代码中,计数器是一个常量,即根本不递增,因此该代码最多在形式上实现了 CTR 模式,但肯定不是功能,而且还存在疏忽的不安全性[2] [3] .

大多数图书馆都会尽力防止这种对 CTR 模式的滥用。因此,在 NodeJS(或任何其他语言)中不太可能找到一个库可以有意实现这一点。

尽管如此,NodeJS(或任何其他语言)中的解密相对容易通过手动实现该模式来实现:在 CTR 模式中,从初始 IV 开始生成字节序列。 IV,通过为每个 block 附加相应的增量 IV。然后用 AES 加密以这种方式生成的序列,并将结果与​​明文/密文 [1] 进行异或运算。 。该方案适用于加密和解密。由于Python代码不执行任何增量,因此必须跳过此步骤,例如:

const crypto = require('crypto');

var algorithm = 'aes-192-ecb';
var key = Buffer.from('LKOXBRRUNBOSMENKEPPZUKWB', 'utf8');
var byteSeq = Buffer.from('HOJFKGQMRCTKUQHPHOJFKGQMRCTKUQHP', 'utf8');
var ciphertext = Buffer.from('r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ==', 'base64');

// Encrypt the byte-sequence generated from the IV (no incrementation)
var cipher = crypto.createCipheriv(algorithm, key, null);
var byteSeqEnc = Buffer.concat([cipher.update(byteSeq), cipher.final()], byteSeq.length);

// XORing of ciphertext and IV
var decrypted = xor(ciphertext, byteSeqEnc);
console.log("Decrypted: " + decrypted.toString('utf8'));
// Output: Decrypted: Testing--StackOverflow

// Implementation of XOR
function xor(buf1, buf2){
var buf = Buffer.alloc(buf1.length);
for (i = 0; i < buf1.length; i++){
buf.writeUInt8(buf1.readUInt8(i, i + 1) ^ buf2.readUInt8(i, i + 1), i);
}
return buf;
}

字节序列的长度对应于四舍五入到 block 大小的整数倍的明文/密文的长度。在当前示例中,字节序列的长度为 32 字节,并且为了简单起见已进行硬编码。

关于python - 将 Python AES 转换为 Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586038/

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