Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS加密三重解密(mcrypt端口)_Javascript_Php_Node.js_Cryptography_Mcrypt - Fatal编程技术网

Javascript NodeJS加密三重解密(mcrypt端口)

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.

我正在努力处理一些用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.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,但是内容/逻辑本身有一些不正确的地方…

The
decr()
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。