【发布时间】: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,感谢您的帮助,在第二次测试中,从
shortkey到key的转换不是零填充吗?谢谢 -
在第二个 sn-p 中,明文用作密钥,反之亦然。此外,它没有实现 PHP 代码中的填充(一般零填充到最接近 8 的倍数)。
-
感谢它可以反转密钥和密码并使用 16 的缓冲区
标签: node.js encryption