【问题标题】:Encrypt des-ede3-cbc nodejs加密 des-ede3-cbc nodejs
【发布时间】:2021-09-21 15:02:19
【问题描述】:

我正在尝试使用 des-ede3-cbc 算法加密字符串

我的base64密码是sq7HjrUOBfKmC576ILgskD5srU870gJ7,我要加密的消息是06080232580,我应该得到的十六进制结果是a5334014a4f010c8779cef789886c123

第一次尝试

const iv = Buffer.alloc(8);
const cipher = crypto.createCipheriv('des-ede3-cbc', Buffer.from('sq7HjrUOBfKmC576ILgskD5srU870gJ7', 'base64'), iv);
let ciph = cipher.update('06080232580', 'utf8', 'hex');
ciph += cipher.final('hex');
console.log(ciph);

结果是a5334014a4f010c8300101ae242354de

另一个测试

let shortkey = Buffer.from('06080232580', 'utf8');
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('sq7HjrUOBfKmC576ILgskD5srU870gJ7', 'base64');

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

结果是6f6b59b6c3ea45592bedbd86db4f31cc5da23d85e2ff773940aaa39e2efdc4ae

我的旧代码在 php 中工作

<?php
$message = "06080232580";
$key = base64_decode("sq7HjrUOBfKmC576ILgskD5srU870gJ7");
$l = ceil(strlen($message) / 8) * 8;
$message = $message.str_repeat("\0", $l - strlen($message));
$result = substr(openssl_encrypt($message, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, "\0\0\0\0\0\0\0\0"), 0, $l);
echo implode(unpack("H*", $result));

结果 id a5334014a4f010c8779cef789886c123

【问题讨论】:

  • PHP 代码使用零填充,NodeJS 代码默认使用 PKCS7。使用cipher.setAutoPadding(false)在上面的NodeJS代码中禁用默认填充并自己实现zero padding
  • @Topaco,感谢您的帮助,在第二次测试中,从shortkeykey 的转换不是零填充吗?谢谢
  • 在第二个 sn-p 中,明文用作密钥,反之亦然。此外,它没有实现 PHP 代码中的填充(一般零填充到最接近 8 的倍数)。
  • 感谢它可以反转密钥和密码并使用 16 的缓冲区

标签: node.js encryption


【解决方案1】:

找到解决办法

    let shortkey = Buffer.from('06080232580', 'utf8');
    let key = Buffer.alloc(16);
    key.fill('\0');
    for (i = 0; i < shortkey.length; i++) {
        key[i] = shortkey[i];
    }
    let IV = Buffer.alloc(8);
    const password = Buffer.from('sq7HjrUOBfKmC576ILgskD5srU870gJ7', 'base64');
    const cipher = crypto.createCipheriv('des-ede3-cbc', password, IV);
    cipher.setAutoPadding(false)
    let encryptedArr = [cipher.update(key)];
    encryptedArr.push(cipher.final());
    encrypted = Buffer.concat(encryptedArr);
    console.log(encrypted.toString('hex'));

【讨论】:

  • 仅适用于大小在 9 到 16 字节之间的明文(这对于 OP 来说可能已经足够,但通常不适用)。此外,静态 IV 也不安全。
猜你喜欢
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2014-03-21
  • 1970-01-01
相关资源
最近更新 更多