从四处搜索,我可以找到一些引用类似问题的链接,但没有什么工作正常,它让我发疯了......
有人可以给我一个关于如何在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;
}
答案 0 :(得分:0)
非常接近于在PHP中使用AES正确执行的CBC模式加密:)对于静态,太短的IV以及未指定字符编码这一事实真的很遗憾(如果plainText
是一个字符串而不是字节)。
否则,这非常类似于使用CBC模式和PKCS#7填充的AES-256,因此您可以在Objective-C中采用任何示例来精确执行。当然,你还需要一个base 64解码器。
然而,您应该生成随机IV并将其作为密文的前缀(安全随机,这在PHP中很棘手)。 IV应该具有与底层密码的块大小相同的大小,在AES的情况下将是16字节。然后解密函数应该从密文中删除这些字节并将它们用作IV。
研究完整性保护(消息认证码或MAC)也是一个非常好的主意。
答案 1 :(得分:0)
在apple dev论坛上得到了解答。
https://devforums.apple.com/message/791166#791166
PHP使用古怪的加密IMO,虽然代码似乎正在做最好避免古怪(例如,AFAICT填充代码实现PKCS#7填充)。您看到的问题可能与PHP如何将字符串“mysite.com”转换为有效的AES-128 IV(其长度必须与块大小匹配,即16字节)有关。很可能PHP填充零(这似乎是PHP的方式),但你必须在PHP方面研究它。
除此之外,这看起来像Common Crypto的一个相当普遍的应用。你需要:
传入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
分享并享受
感谢eskimo1