将Python AES转换为节点
我无法使用Python中现有的遗留代码来加密/解密与NodeJS相同的代码。我确实正确地解码了前16个字符 以下是Python代码:将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,
从加密密码导入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