首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“带有汉字的crypto.createCipheriv”输出不正确

“带有汉字的crypto.createCipheriv”输出不正确
EN

Stack Overflow用户
提问于 2021-05-14 00:57:48
回答 1查看 88关注 0票数 1

当没有汉字时,php和节点输出的结果相同。

但当这是汉字时,php的输出是正确的,节点的输出是不正确的。

代码语言:javascript
复制
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'))

节点输出

代码语言:javascript
复制
6RQdIBxccCUFE+cXPODJzg==
6RQdIBxccCWXTmivfit9AOfoJRziuDf4

php输出

代码语言:javascript
复制
6RQdIBxccCUFE+cXPODJzg==
6RQdIBxccCXFCRVbubGaolfSr4q5iUgw
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-14 12:28:49

问题不在于加密,而在于明文的JSON序列化。

在PHP代码中,json_encode()将字符转换为Unicode转义序列,即编码返回{"key":"\u6d4b\u8bd5"}。然而,在NodeJS代码中,应用了{"key": "测试"}

这意味着最终会对不同的明文进行加密。因此,对于相同的密文,必须使用字节级相同的明文.

如果要在NodeJS代码中应用Unicode转义序列(如Unicode),则需要进行适当的转换。为此,可以使用套餐

代码语言:javascript
复制
const jsesc = require('jsesc');
...
console.log(encodeDesECB(jsesc(`{\"key\":\"测试\"}`, {'lowercaseHex': true}), 'MIGfMA0G')); // 6RQdIBxccCXFCRVbubGaolfSr4q5iUgw

现在返回发布的PHP代码的结果。

如果要在PHP代码中(就像在NodeJS代码中那样)使用Unicode字符,则需要进行适当的转换。为此,可以在JSON_UNESCAPED_UNICODE中设置标志json_encode()

代码语言:javascript
复制
$data = json_encode($data, JSON_UNESCAPED_UNICODE); // 6RQdIBxccCWXTmivfit9AOfoJRziuDf4

现在返回发布的NodeJS代码的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67527852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档