【问题标题】:Difference in PHP encryption from iOS and .NETPHP 加密与 iOS 和 .NET 的区别
【发布时间】:2011-05-23 15:16:37
【问题描述】:

在 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

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

【问题讨论】:

  • 这是我如何使用 StringEncryption.m pastie.org/1365771 的链接
  • 我的 .NET 等价物:pastie.org/1365765(抱歉,每个帖子的链接不能超过一个...)
  • 可能是字符串编码? ASCII、UTF-8、字节序?
  • 我认为它不是编码 - 已尝试将所有内容更改为 ascii 和 utf8。

标签: php objective-c encryption ios mcrypt


【解决方案1】:

很可能是填充问题...有关详细信息,请参阅 herehere

EDIT OP 评论后:

PHP 没有对NULL-padding 以外的其他填充模式的内置支持。至少 .Net 允许您指定 NULL-padding(我认为),另一种选择是在 PHP 中实现 PKCS#7-padding,这并不难。

用填充字符串填充输入 在 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);

【讨论】:

  • 这听起来很有希望。问题是我如何使用 mcrypt 指定填充?在任何地方的文档中都找不到它 - 在 .NET 和 Objective-c 中似乎更明确
  • 是的,这正是我所缺少的。我有一种感觉,其中涉及一些填充。谢谢!
【解决方案2】:

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

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==

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2011-10-11
    • 2011-11-22
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多