Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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
Node.js`crypto.final`make加密结果不同于PHP`mcrypt\u encrypt` 首先是Node.js crypto。 然后,PHP mcrypt。 问题_Php_Node.js_Encryption_Mcrypt - Fatal编程技术网

Node.js`crypto.final`make加密结果不同于PHP`mcrypt\u encrypt` 首先是Node.js crypto。 然后,PHP mcrypt。 问题

Node.js`crypto.final`make加密结果不同于PHP`mcrypt\u encrypt` 首先是Node.js crypto。 然后,PHP mcrypt。 问题,php,node.js,encryption,mcrypt,Php,Node.js,Encryption,Mcrypt,使用相同的字符串、相同的算法和相同的编码 仍然有一小部分不匹配,那就是cipher.final() 下面是真实的示例输出 // Node.js output. UKBI17EIHKNM2EU48ygsjil5r58Eo1csByAIFp9GhUw= ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Same part // PHP output. UKBI17EIHKNM2EU48ygsjil5r58Eo1csAY4C0JZoyco= ^^^^^^^^^^^^^^^^^

使用相同的字符串、相同的算法和相同的编码

仍然有一小部分不匹配,那就是
cipher.final()

下面是真实的示例输出

// Node.js output.
UKBI17EIHKNM2EU48ygsjil5r58Eo1csByAIFp9GhUw=
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Same part

// PHP output.
UKBI17EIHKNM2EU48ygsjil5r58Eo1csAY4C0JZoyco=
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Same part
为什么
cipher.final()
使结果不同


在不修改PHP代码的情况下,如何在Node.js中产生相同的结果

既然您不能更改PHP代码,您将需要修改Node.js代码

问题是node.js的加密模块只使用PKCS#7填充,而PHP只使用零填充。但是,您可以在node.js()中禁用填充以实现自己的零填充:

function zeroPad(buf, blocksize){
    if (typeof buf === "string") {
        buf = new Buffer(buf, "utf8");
    }
    var pad = new Buffer((blocksize - (buf.length % blocksize)) % blocksize);
    pad.fill(0);
    return Buffer.concat([buf, pad]);
}
然后像这样使用它:

var secretKey  = new Buffer('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), // 48 chars
    iv         = new Buffer('bbbbbbbbbbbbbbbb', 'hex'); // 16 chars
var str        = 'This string will be encrypted.';
var cipher     = crypto.createCipheriv('des-ede3-cbc', secretKey, iv);
cipher.setAutoPadding(false);

var cryptedStr = cipher.update(zeroPad(str, 8), 'utf8', 'base64') + cipher.final('base64');

console.log(cryptedStr);
输出:

UKBI17EIHKNM2EU48ygsjil5r58Eo1csAY4C0JZoyco=
以下是匹配的unpad函数的实现:

function zeroUnpad(buf, blocksize){
    var lastIndex = buf.length;
    while(lastIndex >= 0 && lastIndex > buf.length - blocksize - 1) {
        lastIndex--;
        if (buf[lastIndex] != 0) {
            break;
        }
    }
    return buf.slice(0, lastIndex + 1).toString("utf8");
}

js示例导致一个错误:我明白了,我不知道如何使它可见。无论如何,错误是:“buffer.js:348 ret=this.parent.hexWrite(string,this.offset+offset,length);TypeError:无效的十六进制字符串”。@GergoErdosi,你说得对。我修好了。因为我在上一篇文章中为缓冲区写了奇数字符。你知道哪个输出是正确的吗?我不知道哪个是正确的。但我必须关注PHP结果。我使用Node.js连接其他人的PHP系统。我修复了一行。它现在可以工作了。非常感谢!!返回Buffer.concat([buf,新缓冲区(数组((blocksize-(buf.length%blocksize))%blocksize.join('00'),'hex')));这一行
新缓冲区(num)
,似乎得到了随机输出。所以我把它设为('00','hex')结果表明缓冲区需要填充。不能保证它是用零字节填充的。为了更清晰的实现,我改变了主意。出于某种原因,我第一次测试它时它就起作用了。我还添加了一个unpad函数
UKBI17EIHKNM2EU48ygsjil5r58Eo1csAY4C0JZoyco=
function zeroUnpad(buf, blocksize){
    var lastIndex = buf.length;
    while(lastIndex >= 0 && lastIndex > buf.length - blocksize - 1) {
        lastIndex--;
        if (buf[lastIndex] != 0) {
            break;
        }
    }
    return buf.slice(0, lastIndex + 1).toString("utf8");
}