【发布时间】:2014-10-04 17:20:58
【问题描述】:
我正在尝试将加密的 json 文件发送到移动应用程序。
我正在使用带有 MODE_CBC 的 RIJNDAEL_128 和 PHP Mcrypt 模块;在服务器 A(Hostmetro 提供商)上一切正常,但是当我尝试对服务器 B(Hostgator 提供商)使用相同的脚本时,加密的数据无法从移动应用程序中解密。
我使用相同的密钥和相同的 IV(IV 设置为“零”:\0)。
我检查了mcrypt版本,在服务器A和B上是一样的,只是PHP版本不同。
我在我的本地主机上测试脚本,json 加密再次更改。
我所有的测试都表明,如果我尝试加密像“文本”这样的字符串,结果在任何地方都是相同的,但如果我尝试使用 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;
2014 年 8 月 12 日更新
我已经测试了加密文件的生成,我的 localhost 和我的第一台服务器 ( Hostmetro ) 给了我一个有效的文件;只有 Hostgator 会创建一个无法解密的“损坏”文件。
【问题讨论】:
标签: php json encryption mcrypt