当没有汉字时,php和节点输出的结果相同。
但当这是汉字时,php的输出是正确的,节点的输出是不正确的。
const crypto = require('crypto');
function encodeDesECB(textToEncode, keyString) {
var key = new Buffer(keyString.substring(0, 8), 'utf8');
var cipher = crypto.createCipheriv('des-ecb', key, '');
cipher.setAutoPadding(true);
var c = cipher.update(textToEncode, 'utf8', 'base64');
c += cipher.final('base64');
return c;
}
console.log(encodeDesECB(`{"key":"test"}`, 'MIGfMA0G'))
console.log(encodeDesECB(`{"key":"测试"}`, 'MIGfMA0G'))节点输出
6RQdIBxccCUFE+cXPODJzg==
6RQdIBxccCWXTmivfit9AOfoJRziuDf46RQdIBxccCUFE+cXPODJzg==
6RQdIBxccCXFCRVbubGaolfSr4q5iUgw发布于 2021-05-14 12:28:49
问题不在于加密,而在于明文的JSON序列化。
在PHP代码中,json_encode()将字符转换为Unicode转义序列,即编码返回{"key":"\u6d4b\u8bd5"}。然而,在NodeJS代码中,应用了{"key": "测试"}。
这意味着最终会对不同的明文进行加密。因此,对于相同的密文,必须使用字节级相同的明文.
如果要在NodeJS代码中应用Unicode转义序列(如Unicode),则需要进行适当的转换。为此,可以使用套餐:
const jsesc = require('jsesc');
...
console.log(encodeDesECB(jsesc(`{\"key\":\"测试\"}`, {'lowercaseHex': true}), 'MIGfMA0G')); // 6RQdIBxccCXFCRVbubGaolfSr4q5iUgw现在返回发布的PHP代码的结果。
如果要在PHP代码中(就像在NodeJS代码中那样)使用Unicode字符,则需要进行适当的转换。为此,可以在JSON_UNESCAPED_UNICODE中设置标志json_encode()。
$data = json_encode($data, JSON_UNESCAPED_UNICODE); // 6RQdIBxccCWXTmivfit9AOfoJRziuDf4现在返回发布的NodeJS代码的结果。
https://stackoverflow.com/questions/67527852
复制相似问题