Objective-C版本的PHP mcrypt_encrypt

从四周search,我可以find一些链接引用类似的问题,但没有什么是相当的工作,其驱使我疯狂….

有人可以请给我一步一步的指导如何在Objective C中编写下面的PHP代码

我们正在创build一些需要encryption内容的Web服务调用,而且我们只给了PHPencryption样本。 为了清楚我们不想取消encryption,我们想要在IOS中镜像这个encryption过程。

非常感谢

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; } 

非常接近于在PHP中使用AES进行正确执行的CBC模式encryption:)对于静态的,太短的IV以及没有指定字符编码的事实, plainText (如果plainText是一串字符的字节)。

否则,这非常非常像使用CBC模式和PKCS#7填充的AES-256,因此您可以在Objective-C中使用任何示例来执行该操作。 当然你也需要一个base 64解码器。

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

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

在苹果开发论坛上回答了这个问题。

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

PHP使用古怪的encryption国际海事组织,虽然代码似乎在做这是最好的,以避免(例如,AFAICT填充代码实现PKCS#7填充)的古怪。 您看到的问题很可能与PHP将string“mysite.com”转换为有效的AES-128 IV(其长度必须与块大小相匹配,即16个字节)有关。 PHP填充零(这似乎是PHP的方式)是很有可能的,但是你将不得不在PHP方面研究。

除此之外,这看起来像Common Crypto的一个相当常见的应用程序。 你需要:

o传入kCCOptionPKCS7Padding标志

o不通过kCCOptionECBMode标志(所以你得到CBC)

o使用kCCAlgorithmAES128,kCCKeySizeAES128和kCCBlockSizeAES128

做你自己的Base64 [1]

关于最后一点,我build议你最后这样做。 修改PHP代码以打印$ key,$ plainText和$ crypttext作为hex转储,然后在iOS端使用。 一旦工作,然后添加Base64。 这将问题分解了一半,这意味着Base64问题不会与您的encryption问题混淆。

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

$ 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

分享和享受

感谢eskimo1