Javascript NodeJS加密三重解密(mcrypt端口)
我正在努力处理一些用PHP5.5和mcrypt编写的遗留代码。 我想在Node.js中创建一个向后兼容的功能,因此我必须将下面的代码移植到更新的标准中Javascript NodeJS加密三重解密(mcrypt端口),javascript,php,node.js,cryptography,mcrypt,Javascript,Php,Node.js,Cryptography,Mcrypt,我正在努力处理一些用PHP5.5和mcrypt编写的遗留代码。 我想在Node.js中创建一个向后兼容的功能,因此我必须将下面的代码移植到更新的标准中 公共函数decr($hash){ $decoded=base64_decode($hash); $decodedShorter=substr($decoded,0,-8); $iv=子序列号($decoded,-8); $decr=rtrim(@mcrypt_decrypt(mcrypt_3DES,file_get_contents('some.
公共函数decr($hash){
$decoded=base64_decode($hash);
$decodedShorter=substr($decoded,0,-8);
$iv=子序列号($decoded,-8);
$decr=rtrim(@mcrypt_decrypt(mcrypt_3DES,file_get_contents('some.key'),$decodedShorter,mcrypt_MODE_CFB,$iv));
返回$decr;
}
我一直在尝试多种策略,包括crypto js和原生crypto节点外引擎
我面临的最新问题是:
错误加密无效
const decrypt=(text,secretKey,iv=null)=>{
const decipher=crypto.createDecipheriv('des-ede3-cfb8',secretKey,iv);
let decrypted=decipher.update(文本“utf8”);
解密+=解密.final();
返回解密;
};
异步函数main(){
const decoded=atob(名称);
const key=wait readFile(
解析(`some.key`)
)
const decodedShorter=decoded.substr(0,decoded.length-8)
常数iv=已解码的子序列(-8)
返回解密(decodedShorter、密钥、缓冲区。来自(iv))
}
有什么想法吗?新的openSSL实现是否与mcrypt实现如此不同,以至于不兼容?或者我搞砸了什么?我很确定参数的类型是正确的,因为我指的是@types/node/crypto,但是内容/逻辑本身有一些不正确的地方…Thedecr()
PHP代码中的方法first Base64对加密数据进行解码,然后分离密文和IV。此处,8个字节的IV将附加到密文中。之后,在CFB模式下使用AES进行解密。有不同段大小的不同CFB变体,此处使用的段大小为8位。CFB是一种流密码模式,因此不需要/应用填充 发布的NodeJS代码中的错误是,密文和IV使用UTF-8编码作为字符串处理。这通常会破坏任意字节序列(如密文或IV)。
关于密文,损坏发生在
decipher.update(text'utf8')
中。此处,UTF-8在第二个参数中明确指定为输入编码。关于IV,将IV读入缓冲区时会发生损坏:
buffer.from(IV)
。由于第二个参数中未指定编码,因此隐式使用UTF-8。这两个问题都可以通过使用latin1
作为编码来解决
更可靠的解决方案是在整个过程中使用缓冲区,因此无需编码:
var crypto=require('crypto'))
const decrypt=(text,secretKey,iv=null)=>{
const decipher=crypto.createDecipheriv('des-ede3-cfb8',secretKey,iv);
let decrypted=decipher.update(文本,,'utf8');
解密+=最终解密('utf8');
返回解密;
}
const name=“OrjgCsq9EkT2TkCZzDOfW492nXQCNIC0BtVJy1FaaTXv2jXAPqx75kaUJVSG/5MCFXXq”
const decoded=Buffer.from(名称“base64”)
const decodedShorter=decoded.slice(0,decoded.length-8)
常数iv=解码的切片(解码的长度-8)
const key=Buffer.from('ffa3b520582d6ea7de6439ec2bafef46a80810003158922','hex');
console.log(解密(decodedShorter,key,iv))
测试:两个代码都使用密钥$key
将以下密文$ciphertext
解密为给定的明文:
$ciphertext='OrjgCsq9EkT2TkCZzDOfW492nXQCNIC0BtVJy1FaaTXv2jXAPqx75kaUJVSG/5MCFXXq';
$key=hex2bin('ffa3b520582d6ea7de6439ec2bafef46a80810003158922');
//明文:敏捷的棕色狐狸跳过懒惰的狗
OpenSSL适用于PHP5.5,但也请停止使用PHP5。