gpt4 book ai didi

node.js - TripleDes CBC Nodejs 实现问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:08 27 4
gpt4 key购买 nike

我需要在 Nodejs 中复制 http://tripledes.online-domain-tools.com/ 中 3DS CBC 加密的结果。

这是我的代码:

const crypto = require('crypto');
const cipher = crypto.createCipher('des-ede3-cbc', key);
password = Buffer.from('MYPASS', 'utf8');

let encrypted = [cipher.update(password)];
encrypted.push(cipher.final());
encrypted = Buffer.concat(encryptedArr);
console.log(encrypted.toString('hex'));

triples.online-domain-tools.com 的结果是:

Note that the result should be 59 30 20 02 a5 8c dd 5e, but my code gives me 33 97 d8 b0 e3 00 d1 53

请注意,结果应该是 59 30 20 02 a5 8c dd 5e,但我的代码给出了 33 97 d8 b0 e3 00 d1 53。

我错过了什么?

编辑2:根据您的建议,我更改了我的代码(还添加了一些根据 NIST 出版物的指南进行的测试):

const crypto = require('crypto');
function encrypt (inputkey, keyformat, password, passwordformat) {
let shortkey = Buffer.from(inputkey, keyformat);
let key = Buffer.alloc(24);
key.fill('\0');
for (i = 0; i < shortkey.length; i++) {
key[i] = shortkey[i];
}
let IV = Buffer.alloc(8);
const cipher = crypto.createCipheriv('des-ede3-cbc', key, IV);
password = Buffer.from(password, passwordformat);

let encryptedArr = [cipher.update(password)];
encryptedArr.push(cipher.final());
encrypted = Buffer.concat(encryptedArr);
return encrypted;
}

console.log(encrypt('1046913489980131','hex','0000000000000000','hex')); // works
console.log(encrypt('1007103489988020','hex','0000000000000000','hex')); // works
console.log(encrypt('10071034C8980120','hex','0000000000000000','hex')); // works
console.log(encrypt('1046103489988020','hex','0000000000000000','hex')); // works
console.log(encrypt('MYKEY','utf8','MYPASS','utf8')); // fails

NIST 的每个排列操作已知答案测试都效果很好,但其他几个示例(包括图像中的一个)却失败了

我使用这个可疑页面进行测试的原因是因为我的服务提供商正在使用它作为引用。

最佳答案

这个网站给我带来了一些麻烦一段时间,这里是它内部使用的实现,将 key 扩展为 24 字节!我将讨论三元组,但我想这也适用于该网站使用的其他算法

步骤 1

它首先检查输入的 key 是否具有预期的长度,(您可以在该站点底部找到一个表格,其中列出了每种加密算法的 key 长度)如果没有,它将以 0x00 完成。像这样的字节:

var key;// is a string containing the bytes wich will be used to encrypt  the msg
var nullByte = 0x00;
var padding_needed;
for (var i=key.length ;i < expected_key_length ; ++)
{padding_needed =padding_needed + nullBute.tostring(16); }
key = key + padding_needed

例如,3DES 期望的长度是 24 字节;如果您碰巧只输入了这样的 15 个字节 (112233445566778899aabbccddeeff),那么就像您输入了 (112233445566778899aabbccddeeff00)

步骤2

在三元组的情况下,算法将 16 字节扩展为 24 字节 key (这是算法所需的 key 长度),该站点有一个简单的方法可以做到这一点它复制前 8 个字节并将其附加到 key 的末尾,如下所示

key =key + key.substring(0,8);

这就是将要提供给 3DES 加密函数使用的 key

这种简单的方法不被openssl使用,例如,open ssl使用 key MD5的前8个字节,并将它们附加到原始 key 的16个字节以获得3DES所需的24个字节 key ,就像这样

key = key + (MD5(key)).substring(0,8);

摘要

在该工具中,如果您输入 key 112233445566778899AABBCCDDEEFF与输入 112233445566778899AABBCCDDEEFF00 相同与输入 112233445566778899AABBCCDDEEFF001122334455667788 相同因此,为了解决您的问题,您应该为您的函数提供您提供给该站点的完整 24 字节 key ,您肯定会得到相同的结果,因为 nodejs 可能正在做与 openssl 扩展 key 相同的事情(使用 md5)

PS如果您使用 cbc 模式,这就是您的情况,请尝试将 IV 指定为\x00 的 8 个字节,如下所示“0000000000000000”结果是一样的!!

这是代码的有效实现,您可以在网站中查看它

    const crypto = require('crypto');
function encrypt (inputkey, keyformat, password, passwordformat) {
let shortkey = Buffer.from(inputkey, keyformat);
let key = Buffer.alloc(24);
key.fill('\0');
for (i = 0; i < shortkey.length; i++) {
key[i] = shortkey[i];
}
let IV = Buffer.alloc(8);


var expansionStart = shortkey.length>16?shortkey.length:16;
for (i=expansionStart;i<24;i++){
key[i]=key[i-expansionStart];
}
console.log(key);
const cipher = crypto.createCipheriv('des-ede3-cbc', key, IV);
password = Buffer.from(password, passwordformat);

let encryptedArr = [cipher.update(password)];
encryptedArr.push(cipher.final());
encrypted = Buffer.concat(encryptedArr);
return encrypted;
}
var enc = encrypt("112233445566778899AABBCCDDEEFF","hex","password","utf8");
console.log(enc);

关于node.js - TripleDes CBC Nodejs 实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46353150/

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