1

通过四处搜索,我可以找到许多引用类似问题的链接,但没有什么是有效的,它让我发疯....

有人可以给我一个关于如何在Objective C中编写以下PHP代码的分步指南。

我们正在创建一些需要加密内容的 Web 服务调用,并且我们只获得了 PHP 加密示例。明确地说,我们不想取消加密,我们想在 IOS 中镜像这个加密过程。

非常感谢

function encrypt($plainText) {

      $initVector = "mysite.com";      
      $key = base64_decode("GfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDosY=");

      $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
      $padding = $block - (strlen($plainText) % $block);
      $plainText .= str_repeat(chr($padding), $padding);
      $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plainText, MCRYPT_MODE_CBC, $initVector);
      $crypttext64 = base64_encode($crypttext);

      return $crypttext64;
}
4

2 回答 2

0

非常接近于在 PHP 中使用 AES 正确执行的 CBC 模式加密 :) 对于静态的、太短的 IV 以及尚未指定字符编码的事实(如果plainText是字符串而不是字节)。

否则,这看起来很像使用 CBC 模式和 PKCS#7 填充的 AES-256,因此您可以在 Objective-C 中使用任何示例来精确执行它。当然,您还需要一个 base 64 解码器。

但是,您应该生成一个随机 IV 并将其作为密文的前缀(安全随机,这在 PHP 中很棘手)。IV 的大小应与底层密码的块大小相同,在 AES 的情况下为 16 个字节。然后解密函数应该从密文中删除这些字节并将它们用作IV。

研究完整性保护(消息身份验证代码或 MAC)也是一个非常好的主意。

于 2013-02-26T21:24:12.230 回答
0

在苹果开发论坛上得到了回答。

https://devforums.apple.com/message/791166#791166

PHP 使用古怪的加密 IMO,尽管代码似乎在尽力避免古怪(例如,AFAICT 填充代码实现 PKCS#7 填充)。您看到的问题很可能与 PHP 如何将字符串“mysite.com”转换为有效的 AES-128 IV(其长度必须与块大小匹配,即 16 个字节)有关。PHP 很可能用零填充(这似乎是 PHP 的方式),但您必须在 PHP 方面进行研究。

除此之外,这看起来像是 Common Crypto 的一个相当普遍的应用。你需要:

o 传入 kCCOptionPKCS7Padding 标志

o 不传入 kCCOptionECBMode 标志(所以你得到 CBC)

o 使用 kCCAlgorithmAES128、kCCKeySizeAES128 和 kCCBlockSizeAES128

o 做你自己的 Base64 [1]

关于最后一点,我建议你最后这样做。修改 PHP 代码以将 $key、$plainText 和 $crypttext 打印为十六进制转储,然后在 iOS 端使用它们。一旦工作正常,然后添加 Base64。这将问题分成两半,这意味着 Base64 问题不会与您的加密问题混为一谈。

最后,请记住 OS X 在命令行上有一个方便的 Base64 编码器和解码器。例如,要获取示例中加密密钥的十六进制转储,您可以执行以下操作:

$ openssl enc -d -base64 | hexdump -C GfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDosY= ^D 00000000 19 f4 83 7d 74 b5 e1 4f 08 dd 88 25 10 5a cc 8c |...}t..O...%.Z..| 00000010 c3 8e 9c 44 94 33 13 77 c1 14 ed d5 37 83 a2 c6 |...D.3.w....7...| 00000020

分享和享受

感谢爱斯基摩人1

于 2013-03-05T18:23:20.057 回答