Node crypto.final() 似乎导致与 PHP mcrypt_encrypt 两方加密结果不同?
发布于 9 年前 作者 grass0916 5641 次浏览 最后一次编辑是 8 年前 来自 问答

加密演算法我使用的是 Triple DES,而以下会出现的 key,IV 我已经先行替换了。


首先我使用的是 Node.js crypto 做加密。

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),
    cryptedStr = cipher.update(str, 'utf8', 'base64') + cipher.final('base64');

再來是协作方的系统,使用的是 PHP 的 mcrypt。

$key    = pack('H*', "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
$iv     = pack('H*', "bbbbbbbbbbbbbbbb"); 
$string = 'This string will be encrypted.';
$text   = mcrypt_encrypt(MCRYPT_3DES, $key, $string, MCRYPT_MODE_CBC, $iv);
$text_base64 = base64_encode($text);

我遇到的问题是,明明使用相同的 Key / IV、演算法以及编码方式,但结果就是会有一部分不同。

而观察之下,不同处却是 cipher.final() 所导致?

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

// PHP output.
UKBI17EIHKNM2EU48ygsjil5r58Eo1csAY4C0JZoyco=
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Same part

还请教各位大侠、前辈,究竟是为什么呢?

2 回复

由于想和php加解密兼容,结果我也遇到这样的问题了 cipherChunks.push(cipher.update(data, ‘binary’, ‘base64’)); cipherChunks.push(cipher.final(“base64”)); cipher.final(“base64”) 确实导致数据和php不一样,我也没有找到方法。请高人指导 经过研究发现:cipher.final(“base64”) 的结果在php解码,字符串后面有很多方框…

回到顶部