我正在尝试将加密的json文件发送到移动应用。
我正在使用RIJNDAEL_128和MODE_CBC使用PHP Mcrypt模块;所有工作在服务器A(Hostmetro提供商)上都很完美,但是当我向服务器B(Hostgator提供商)尝试相同的脚本时,加密的数据无法从移动应用程序解密。
我使用相同的密钥和相同的IV(IV设置为'0':\ 0)。
我已经检查了mcrypt版本,它在服务器A和B上是相同的,只有PHP版本不同。
我在本地主机上测试脚本,json加密再次更改。
我所有的测试都表示,如果我尝试加密像'text'这样的字符串,结果在任何地方都是一样的,但是如果我尝试使用json,结果会有很大不同:问题在哪里?
感谢。
更新: 加密函数的代码是:
$str = $decrypted;
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
if (($pad = $block - (strlen($str) % $block)) < $block)
{
$str .= str_repeat(chr($pad), $pad);
}
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->the_key, $str, MCRYPT_MODE_CBC, $iv));
这是解密功能的代码:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->the_key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv);
# Strip PKCS7 padding.
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = ord($str[($len = strlen($str)) - 1]);
if ($pad && $pad < $block && preg_match(
'/' . chr($pad) . '{' . $pad . '}$/', $str))
{
return substr($str, 0, strlen($str) - $pad);
}
return $str;
更新08/12/2014
我已经测试了加密文件的生成和我的localhost,我的第一台服务器(Hostmetro)给了我一个有效的文件;只有Hostgator创建一个无法解密的“损坏”文件。
答案 0 :(得分:2)
在加密/解密之前尝试使用base64_encode / decode ..
答案 1 :(得分:0)
好的,我发现了问题:问题是当json_encode()尝试对多维数组进行编码而并非加密此json对象时所有内容都被强制转换为字符串,它可以由PHP在其他服务器中解密或者相同但不是移动应用程序。
解决方案
解决方案将数据转换为String ,使用json_encode()转换数组,使用mcrypt加密json:all现在正在运行。