json_encode对加密字符串不起作用

时间:2014-07-03 19:27:27

标签: php json node.js encryption phpseclib

我遇到了一些麻烦,因为我想加密一些从表单中获取的帖子数据,然后以json格式将它们发送到我的nodejs服务器,将它们放入数据库中。

我的问题:我似乎无法在加密后发布数据。我可以发布json字符串就好了,但没有更多:

我的代码:

$rsa->loadKey($keydata);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$encrypted = $rsa->encrypt("test");

$jsonArray = array(
    'crypt' => $encrypted
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;

$ch = curl_init('https://..........');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonArrayEncoded);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

我甚至没有得到回声输出。但字符串似乎加密,因为我可以回应(很多字符集错误+一些随机字母和数字),如果我在php skript解码它我也得到正确的结果。我没有得到任何控制台警告或错误,无论是chrome还是firefox。

我做错了什么? (很确定有)

e:我正在使用它作为加密库:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc1

edit2:好吧,正如评论中所建议的那样,我将字符串转换为utf8,但现在用我的密钥解密似乎太长了...艰难的o只加密了“test”这个词...

我想我必须深入挖掘......

如果有人知道:对于解密,我正在使用带有以下代码的node.js的Ursa模块:

var buffer = new Buffer(req.body.crypt);

var data = private.decrypt(buffer, 'utf8', 'utf8', ursa.RSA_PKCS1_PADDING);

2 个答案:

答案 0 :(得分:1)

  

好吧,正如评论中所建议我将字符串转换为utf8,但是   现在用我的钥匙解密似乎太长了...艰难的o   只加密了单词" test" ...

帮助您查看更新后的代码。代替这样做......

json_encode本身不处理二进制数据。我的建议是做这样的事情:

$jsonArray = array(
    'crypt' => bin2hex($encrypted)
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;

在json解码它之后,你需要将它压缩回二进制文件。

或者,您可以在以后执行base64_encode和base64解码。

我对utf8编码的关注是PHP的内部字符串类型不是utf8。如果Java那么可能会导致问题。

答案 1 :(得分:0)

json_encoding函数有许多可以传递给它的标志,这使得函数能够解析特定的字符集。以下调用可能会解决您遇到的问题

json_encode($jsonArray, JSON_UNESCAPED_SLASHES | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP );