PHP iOS AES加密

7
我一直在尝试使用AES加密在PHP和我的iOS应用程序之间进行通信时遇到了麻烦。
目前,我考虑了两种实现方法。第一种是使用OpenSSL。
在iOS端,我实现了一种模仿这里http://saju.net.in/code/misc/openssl_aes.c.txt的代码的方式。
在PHP端,我使用iPhone生成的密钥和IV作为输入,将其用于PHP openssl encrypt。
结果在输出方面有所不同...
我还考虑过:http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html 但是这个SO帖子:AESCrypt decryption between iOS and PHP让我却步了。
该项目没有绑定AES,只是看起来像一个强大的加密算法,不会太难实现。
我基本的问题是:实现一种好的加密算法,以便在iOS和PHP之间进行通信的最简单方法是什么?

7
最简单的方法是通过HTTPS传输您的数据,因为iPhone和您的Web服务器肯定内置了对此的支持。 - derobert
你能解释一下项目的基本目的吗,而不泄露太多信息吗?这可能有助于解决你面临的问题,或者我们可以分享替代路线,因为你提到你并没有被绑定在AES上。 - JM4
我正在iOS设备和PHP后端之间传递敏感客户数据。我希望数据在数据包嗅探、伪造的登录尝试等方面是安全的。 - Silvae
2
这仍然听起来像是 SSL 或 TLS 的完美工作。当然,如果有人拿到了您的应用程序,他们可以尝试登录而无法阻止。您也可以为用户提供证书并执行客户端身份验证,但密钥将在设备上,并可能泄漏出去。我想我听说过 iOS 设备上有一个密钥库。 - Maarten Bodewes
我喜欢使用https的想法,但是过去在尝试使用iPhone获取https数据时遇到了问题。服务器似乎无法与手机握手。出现了一个身份验证挑战,我无法在手机端通过。还有其他人遇到过这个问题吗? - Silvae
@Silvae 我曾经遇到过类似的问题,但那只是因为我使用的证书没有正确安装。iOS 对证书的要求似乎比 PC 浏览器更严格。你可以尝试使用 https。运行一次测试来查看你的证书是否存在问题应该不难。 - 0x6A75616E
3个回答

3

我刚完成了同样类型的项目。我使用了你在“也可以考虑”的参考库。

这里有一些用php解密的示例代码:

$iv2 = '';
for($i=0;$i<16;$i++){
    $iv2 .= "\0";   
}
$plain_text_CBC = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted_text, MCRYPT_MODE_CBC, $iv2);
var_dump($plain_text_CBC);

请确保您的密钥都是256位(32个字符),我目前还没有遇到任何编码问题,但如果您遇到了,请记住您正在加密字节而不是字符。请注意,在MCRYPT_RIJNDAEL_128中,128是块大小而不是键大小,而在AES256DecryptWithKey方法中,256是关键大小的引用,而块大小为128。 AES256DecryptWithKey以CBC模式运行,但具有空初始化向量(iv)。
CBC意味着每个块依赖于上一个块,因此它使用预设的、通常是随机的“块-1”称为IV
ECB意味着每个块都以相同的方式加密,因此它会揭示同一消息中两个块是否相同。提到的库没有使用它,所以我只是为了对比而提到了它。
使用零iv(0000000000000000字节)被认为是不安全的。要修复这个问题,您需要创建一个NSData * iv变量来存储IV,并修改NSData + AESCrypt.m的CCcrypt参数以添加[iv bytes]作为iv参数(我还没有测试过这段代码),并且您需要存储这个iv并将其传递给php以及您的消息。但是首先,我会测试并确保一切都可以使用零iv。

使用IV的整个目的在于它对于每个数据片段是唯一的:它不是一个秘密,你可以将其附加到你的密文中。对所有加密使用相同的IV实际上与不使用IV一样安全。请考虑审查我的说法并从答案中编辑这些错误信息。 - Mark Fox
使用初始化为零的IV是不安全的,因为已知存在攻击和漏洞,例如:cookie窃取和特权升级(BEAST)。 - Michele Giuseppe Fadda
感谢您的精彩评论! - user1122069
非常感谢!我已经寻找了一个星期了。 - Dark Innocence

1

如评论所述,对于您来说,使用HTTPS可能是最简单的。

我曾经设置过一个iPhone应用程序,它必须通过HTTPS与PHP后端通信,并花费了很多时间试图找出为什么iPhone不接受加密连接。

事实证明,它之所以不起作用,是因为我在服务器端使用了自签名证书。从证书颁发机构购买SSL证书解决了所有问题。

验证单个域名而不进行公司或扩展验证的SSL证书非常便宜,因此我建议您尝试一下!


0

举个直接的例子,我的开源项目“Techno Tap”包含使用AES加密的PHP和iOS源代码,可以随意查看这里

iOS上的加密是在ScoreboardManager.m中完成的(使用NSData+AES),解密则在PHP端的Scoreboard.php中完成


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接