1

在 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 加密附加在此文件中:

StringEncryption.m:http ://pastie.org/1365766

我希望有人可以帮助我发现我遗漏了什么或有一些不同的值参数。我已经看了几个小时,找不到其他可以尝试的东西。

4

2 回答 2

1

很可能是填充问题...有关更多信息,请参阅此处此处

OP评论后编辑:

NULL除了-padding之外,PHP 没有对其他填充模式的内置支持。至少 .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);
于 2010-12-10T17:45:34.840 回答
0

经过长时间的测试,我认为这种加密方法适合测试:

function mc_encrypt($str = "Affe", $key = "12345678901234567890123456789012")
{
    $str = "Affe";
  $block = mcrypt_get_block_size('rijndael-256', 'cbc');
    $pad = $block - (strlen($str) % $block);
    $str .= str_repeat(chr($pad), $pad);

    $encoded =  base64_encode(mcrypt_encrypt('rijndael-256', $key, $str, 'cbc',$key));
    file_put_contents("test.txt",$encoded);
    return $encoded;
}

我在 iOS 上得到了这个: v+cB4woDYANTozUbOgxJ4rWKb59EfLf6NkRE/Ee0kYY= 但是如果我尝试解密(见上文),我得到了(null)

另一方面,如果我在 iOS 上加密,我得到了这个: UUfn34iyNlSK40VaehloaQ==

绝对是短(或另一个是长)...再次搜索错误。

于 2012-10-09T12:13:18.383 回答