Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python AES转换为节点_Python_Node.js_Encryption_Cryptography_Aes - Fatal编程技术网

将Python AES转换为节点

将Python AES转换为节点,python,node.js,encryption,cryptography,aes,Python,Node.js,Encryption,Cryptography,Aes,我无法使用Python中现有的遗留代码来加密/解密与NodeJS相同的代码。我确实正确地解码了前16个字符 以下是Python代码: 从加密密码导入AES 计数器=b'HOJFKGQMRCTKUQHP' 密码=AES.new(自对称密钥,AES.MODE\u CTR,计数器=lambda:counter) 加密=加密。加密(数据) 我找到一个源,在每次迭代中使用相同的计数器: 在NodeJS(ts节点)中仅对前16个字符起作用的是: 从'crypto'导入{createDecipheriv,

我无法使用Python中现有的遗留代码来加密/解密与NodeJS相同的代码。我确实正确地解码了前16个字符

以下是Python代码:

从加密密码导入AES
计数器=b'HOJFKGQMRCTKUQHP'
密码=AES.new(自对称密钥,AES.MODE\u CTR,计数器=lambda:counter)
加密=加密。加密(数据)
我找到一个源,在每次迭代中使用相同的计数器:

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

从'crypto'导入{createDecipheriv,Decipher}
const decrypt=(inputBase64:string):string=>{
常量算法='aes-192-ctr';//24字节密钥,16字节“计数器”
var decipher:decipher=createDecipheriv(算法、密钥、计数器/*是,它是一个iv*/)
//解密。设置自动添加(false);
返回decipher.update(inputBase64,'base64','utf8')+decipher.final('utf8');
}
我找到了各种在线来源,它们都增加了计数器-有没有办法通过内置的节点加密库控制计数器的增量?我发现了一些可以覆盖的在线实现(如果是这样的话):

我怎样才能让它在节点中工作?我的python代码(这是遗留代码,如果不迁移现有值,我将无法更改)具有以下输出:

encrypt('Testing--StackOverflow')
# outputs: 'r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ=='
从节点使用上述
解密
函数:

const key='LKOXBRRUNBOSMENKEPPZUKWB';
常量计数器='HOJFKGQMRCTKUQHP';
const encrypted='r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ=';
常量明文=解密(加密);
console.log('明文:',明文)
//输出:明文:测试——StackOv�::��M

希望有人能在这里分享一些见解

CTR模式的关键是计数器的递增,这就是为什么该模式实际上被称为计数器模式。因为在Python代码中,计数器是一个常量,即根本不递增,所以该代码最多在形式上实现CTR模式,但肯定不是在功能上实现的,而且也是不安全的

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

然而,通过手动实现该模式,NodeJS(或任何其他语言)中的解密相对容易实现:在CTR模式中,从初始IV开始,通过为每个块添加相应的递增IV,从IV生成字节序列。然后用AES对以这种方式生成的序列进行加密,并用明文/密文对结果进行异或加密。此方案同时适用于加密和解密。由于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;
}
const crypto=require('crypto');
var算法='aes-192-ecb';
var key=Buffer.from('LKOXBRRUNBOSMENKEPPZUKWB','utf8');
var byteSeq=Buffer.from('HOJFKGQMRCTKUQHPHOJFKGQMRCTKUQHP','utf8');
var ciphertext=Buffer.from('r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ==','base64');
//加密从IV生成的字节序列(无增量)
var cipher=crypto.createCipheriv(算法,密钥,空);
var byteSeqEnc=Buffer.concat([cipher.update(byteSeq),cipher.final()],byteSeq.length);
//密文与IV的异或运算
var decrypted=xor(密文,字节数);
log(“Decrypted:”+Decrypted.toString('utf8'));
//输出:解密:测试——堆栈溢出
//异或的实现
函数异或(buf1,buf2){
var buf=Buffer.alloc(buf1.length);
对于(i=0;i

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

对于CTR模式而言,计数器的递增是必不可少的,这就是为什么该模式实际上被称为计数器模式。因为在Python代码中,计数器是一个常量,即根本不递增,所以该代码最多在形式上实现CTR模式,但肯定不是在功能上实现的,而且也是不安全的

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

然而,通过手动实现该模式,NodeJS(或任何其他语言)中的解密相对容易实现:在CTR模式中,从初始IV开始,通过为每个块添加相应的递增IV,从IV生成字节序列。然后用AES对以这种方式生成的序列进行加密,并用明文/密文对结果进行异或加密。此方案同时适用于加密和解密。由于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;
}
const crypto=require('crypto');
var算法='aes-192-ecb';
var key=Buffer.from('LKOXBRRUNBOSMENKEPPZUKWB','utf8');
var byteSeq=Buffer.from('HOJFKGQMRCTKUQHPHOJFKGQMRCTKUQHP','utf8');
var ciphertext=Buffer.from('r7G8gFNIHuY27nBjSo51nZ6mqZhVUQ==','base64');
//加密从IV生成的字节序列(无增量)
var cipher=crypto.createCipheriv(算法,密钥,空);
var byteSeqEnc=Buffer.concat([cipher.update(byteSeq),cipher.final()],byteSeq.length);
//密文与IV的异或运算
var decrypted=xor(密文,字节数);
log(“Decrypted:”+Decrypted.toString('utf8'));
//输出:解密:测试——堆栈溢出
//异或的实现
函数异或(buf1,buf2){
var buf=Buffer.alloc(buf1.length);
对于(i=0;i