Objective-C version of PHP mcrypt_encrypt


Objective-C version of PHP mcrypt_encrypt

从搜索周围,我可以找到一些链接引用类似的问题,但没有什么是相当的工作,它驱使我发疯....

有人可以给我一个一步一步的指导如何在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;
}

这来非常接近是一个正确执行的CBC模式加密使用AES在PHP:)这真的是一个遗憾的静态,太短的IV和事实,字符编码没有被指定(在情况下plainText是字符串的字符而不是字节)。

否则,这看起来非常非常像使用CBC模式和pkcs# 7填充的AES-256,所以你可以在Objective-C中使用任何例子来精确地执行它。当然,你还需要一个64进制解码器。

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

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

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

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

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

除此之外,这看起来像是通用加密的一个相当常见的应用。你需要:

传递kCCOptionPKCS7Padding标志

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

使用kCCAlgorithmAES128、kCCKeySizeAES128和kCCBlockSizeAES128

do your own Base64 [1]

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

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

$ openssl enc -d -base64 | hexdump -CGfSDfXS14U8I3YglEFrMjMOOnESUMxN3wRTt1TeDosY =^维00000000 19 83 7 d 74 b5 e1 4 f 08年f4 dd 5 88 25 cc 8 c |…}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

分享与享受

Thanks to eskimo1