【问题标题】:json_decode returns NULL after the json string was decrypted with mcrypt_decrypt (aes)json_decode 在使用 mcrypt_decrypt (aes) 解密 json 字符串后返回 NULL
【发布时间】:2015-04-10 23:25:05
【问题描述】:

我想将“消息”作为 json 数据发送到 php。但是“消息”必须是一个字符串。如果我在 Javascript 中“字符串化”我的 json 数据并使用“CryptoJS.AES.encrypt”加密它们,我无法在 PHP 中获取单个内容,因为“json_decode”总是返回 NULL。

我使用过“json_last_error”它返回 3。当我使用“utf8_encode”和 json_encode 对其进行编码时,它返回 0。

“mcrypt_decrypt”是 PHP AES 解密器。

我真的不知道该怎么办。请帮助我并提前致谢!

//JAVASCRIPT
    var encrypted = CryptoJS.AES.encrypt(
        JSON.stringfy({'message':'message','messageA':'messageA','messageB':'messageB'}),
        key512Bits500Iterations, {iv:iv});

    var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);
    var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64);

    $.ajax({
		url: 'http://localhost/workspace/messageAppl.php',
		type: 'POST',
		data: {
          'data_base64':data_base64,
          'iv_base64':iv_base64,
          'key_base64':key_base64 //key_base64 will be encrypted with RSA
		},
    	success: function(data){
        	alert(data);
        },
        error: function(){
          alert('Index-Error');
    	}	
    });

//    PHP

    // I can get the jsonString but I can't get the single message like 'message', 'messageA' or 'messageB'
         ...
         
     //Decryption in PHP
         public function jsMessage($data_base64, $iv_base64, $key_base64){
			$data_enc = base64_decode($data_base64); // data_base64 from JS
			$iv        = base64_decode($iv_base64);   // iv_base64 from JS
			$key       = base64_decode($key_base64);  // key_base64 from JS
		
			$plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $data_enc, MCRYPT_MODE_CBC, $iv ), "\t\0 " );
			return $plaintext;
		}

         
    $json_string = aes_decrypt($_POST['data_base64'], $_POST['iv_base64'], $_POST['key_base64']);


    // json_decode returns NULL but WHY?
    $array=json_decode($json_string);

    $message=$array->message
    $messageA=$array->messageA
    $messageB=$array->messageB
**Edit 1**
The error message I get is:
**"Control character error, possibly incorrectly encoded"**

but the Json which I get in php after the decryption is valid:
{"message":"blablabalbalbalaballab","messageA":"blablabalbalbalaballab" ,"messageB":"blablabalbalbalaballab"}

并确保我已经一次又一次地测试了 json here



**编辑 2 **



我不能用这些标志发布它,这就是我拍照片的原因。

【问题讨论】:

  • 如果不加密字符串,json_decode 是否有效?
  • 不应该是stringifyJSON.stringify
  • 我希望这不是您的应用程序的真正设计方式。在与加密数据相同的 AJAX 请求中发送密钥是没有意义的。如果有人得到加密的消息,他们也会得到密钥,所以他们可以自己解密。
  • 很明显你的解密码有问题。请edit您的问题添加一个可重现的问题示例。
  • @Barmar 密钥将使用 RSA 加密,JSON.stringify 不是问题。一切都适用于普通字符串。但我不想加密和解密每一个字符串,因为它花费了太多时间。

    Artjom B. :我添加了解密方法。

    感谢您的回答!

标签: php json cryptojs


【解决方案1】:

the user notes on mcrypt_decrypt()有答案

看来 mcrypt_decrypt 用空值 ('\0') 填充 RETURN STRING 以填充到 n * blocksize

$json = rtrim($json, "\0");

【讨论】:

  • 然后 $strPad = ord($json[strlen($json)-1]); $n_data = substr($json, 0, -$strPad); $row=json_decode($n_data);
【解决方案2】:

看起来您正在对加密的 json 字符串进行 base64 编码。但是,在您尝试解密之前,您没有在 PHP 示例中对其进行 base64 解码。

另外,如果您的解密函数是mcrypt_decrypt,那么您传递的参数错误,它需要是 mcrypt_decrypt($cipher, $key, $data, $mode, $iv)。

编辑:更多信息

您似乎也在对您在 ajax 调用中传递的其他值进行 base64 编码,但在您的示例中没有在 php 端解码它们,也需要这样做。

【讨论】:

  • 解密可以正常使用普通字符串。我已经编辑了我的问题。请看我的解密代码。我可以得到 jsonString 但我无法在 php 中解析 jsonString
【解决方案3】:

说明
场景:在 JS 中,我使用 cryptojs 加密 jsonString。在 PHP 中,我使用“mcrypt_decrypt”对其进行解密。
但是解密后我在php中得到的JsonString最后有一些有趣的字符。
如果我复制var_dump()的输出并将其粘贴到IDE(即notepad++、eclipse等),我只能看到这些字符.).

这些字符始终为 12。我不知道它们来自哪里(可能在消息被加密或解密时),但是在“子串”它们之后,我可以获得“json_decode()”的有效 jsonString。

解决方案
我只是在最后一个大括号之后对 12 个不可见字符进行子串化,它可以工作。我希望它可以帮助某人。

json_decode(substr( $json, 0, strlen( $jsonString)-12));


编辑

最好使用这个:
$strPad = ord($json[strlen($json)-1]);
$n_data = substr($json, 0, -$strPad); 
$row=json_decode($n_data );


json_decode(substr( $json, 0, strlen( $jsonString)-12));

所以你不需要像我一样计算你必须删除的点数。

【讨论】:

  • 此代码仅删除最后 12 个字符。请你解释一下你的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多