我在 iOS 和 PHP 之间进行加密通信时遇到问题。我有一个应用程序,可以加密字符串并将其发送到 PHP 服务器进行解密。那部分工作得很好。现在 PHP 服务器需要将加密的响应发送回应用程序,这似乎导致了一些问题
更多白发。
问题是,当我在 PHP 中加密字符串时,它看起来与在 iOS 甚至 .NET 中加密的同一字符串不同 - 显然所有地方都使用相同的算法、密钥和 IV。
我在 CBC 模式下使用 Rijndael 128,IV 包含空字节(到目前为止)。
PHP 加密看起来像这样:
$encrypted = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->secret_key, $str, MCRYPT_MODE_CBC, $this->iv );
$encrypted = base64_encode( $encrypted );
iOS 加密附加在此文件中:
字符串加密.m:http://pastie.org/1365766 http://pastie.org/1365766
我希望有人能帮助我找出我遗漏的地方或有一些不同的参数值。我已经看了几个小时了,找不到其他可以尝试的东西。
很可能是填充问题......请参阅here https://stackoverflow.com/questions/4192658/aes-encrypt-in-c-decrypt-in-php/4196648#4196648 or here https://stackoverflow.com/questions/4251289/des-encryption-in-php-and-c/4256728#4256728了解更多信息。
EDITOP评论后:
PHP 没有内置支持除NULL
-填充。至少 .Net 允许您指定 NULL 填充(我认为),另一个选择是在 PHP 中实现 PKCS#7 填充,这并不难做到。
使用填充字符串填充输入
1 到 8 个字节之间,使
总长度是8的精确倍数
字节。每个字节的值
填充字符串设置为数量
添加的字节 - 即 8 个字节的值
0x08,7 个字节的值 0x07,...,2
0x02 的字节,或值的一个字节
0x01。
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$padding = $blockSize - (strlen($data) % $blockSize);
$data .= str_repeat(chr($padding), $padding);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)