是否可以在 iOS 上使用 AES128 和 GCM 模式?

tan*_*nou 5 encryption cryptography aes ios aes-gcm

所以我想问各位 stackoverflow 天才的问题是:是否有一种方法(本机、库、框架等)使用强大的经过身份验证的加密算法(例如GCM 模式)使用AES (最好是 128,但也可以是 256)来加密数据?

问题很短,我做了一些研究,我只找到了一个似乎支持它的库(RNCryptor),但它似乎也使用密码来加密而不是密钥(就像你提供密码,库制作了密钥),我不太喜欢这样,我更喜欢自己管理我的钥匙

我还查看了CommonCryptor.h,发现了这一行,在我看来,这是 commoncryptor 源代码中 GCM 的唯一参考(但我可能是错的,实际上我可能是错的):

case kCCModeGCM: if((ref->symMode[direction].gcm = getCipherMode(cipher, mode, direction).gcm) == NULL) return kCCUnimplemented;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

tan*_*nou 2

感谢 owlstead 建议我更深入地研究 RNCryptor 并找到了解决方案。

首先,经过大量谷歌搜索后,Zaph 似乎是对的,iOS 不提供 GCM,但在 iOS 中使用它。参考文献:iOS 安全 2014 年 2 月

其次,RNCryptor不使用GCM,而是使用CBC模式(密码块链接)的AES256,这很好,然后使用HMAC+SHA1进行身份验证。这符合我的要求。

为了使用密钥加密并跳过密码推导部分,RNCryptor 提供了以下函数:

NSData *encryptedData = [RNEncryptor encryptData:yourData
                                        withSettings:kRNCryptorAES256Settings
                                       encryptionKey:encryptionKey
                                             HMACKey:HMACKey
                                               error:&error];
Run Code Online (Sandbox Code Playgroud)

然后用这个解密

NSData *decryptedData = [RNDecryptor decryptData:encryptedData withEncryptionKey:encryptionKey HMACKey:HMACKey error:&decryptionError];
Run Code Online (Sandbox Code Playgroud)

RNCryptor 还提供密钥的随机生成方法。

注意:使用 AES256 时要小心,密钥调度可能很弱:Schneier 文章,但没有戏剧性,并且关于 AES256 的其他观点是优点:Colin Percival 文章