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

5
我有一个问题想问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;

提前感谢!


我们的SecureBlackbox支持AES-GCM,并可用于iOS。但这是未记录的功能,因此您需要在我们的论坛上请求示例。 - Eugene Mayevski 'Callback
3个回答

2
感谢owlstead的建议,让我深入了解了RNCryptor并找到了解决方案。
首先,在大量搜索后,似乎Zaph是正确的,iOS不提供GCM,但在iOS中使用它。参考:iOS Security feb 2014 其次,RNCryptor不使用GCM,而是使用AES256的CBC模式(密码块链接),这很好,并且使用HMAC + SHA1进行身份验证。这符合我的要求。
为了使用密钥进行加密并跳过密码推导部分,RNCryptor提供了此功能:
NSData *encryptedData = [RNEncryptor encryptData:yourData
                                        withSettings:kRNCryptorAES256Settings
                                       encryptionKey:encryptionKey
                                             HMACKey:HMACKey
                                               error:&error];

然后用这个解密。
NSData *decryptedData = [RNDecryptor decryptData:encryptedData withEncryptionKey:encryptionKey HMACKey:HMACKey error:&decryptionError];

RNCryptor还提供了密钥的随机生成方法。
注意:使用AES256时要小心,密钥调度可能会很弱:Schneier文章,但没有大问题,对于AES256还有其他的优点观点:Colin Percival文章

2

RNCryptor使用HMAC,这被认为是创建身份验证标签的加密强方法。它也是开源的。因此,我建议您认真考虑克隆RNCryptor代码(保持头部版权完整!)。

基于密码的加密包括派生密钥(以及可能的IV),然后执行加密和身份验证。因此,您可以通过简单地删除密钥派生部分来解决问题。

唯一不起作用的时间是如果密钥派生代码编织到执行加密/身份验证的部分中,但这似乎不是RNCryptor的情况。


谢谢伙计!我按照你的建议操作了,发现在RNCryptor中可以使用密钥并跳过密钥派生。然而,RNCryptor不使用GCM而是使用CBC和HMAC+SHA1,但这符合我的要求。感谢你的指导! - tanou

1

CommonCrypto中缺少GCM。有趣的是,自iOS5以来,苹果一直在使用GCM作为钥匙串的加密方式。


我对CommonCrypto中可用的模式/方法的缺乏感到非常惊讶,因为它们中的大多数(或至少很多)都被苹果在iOS中使用(http://images.apple.com/ipad/business/docs/iOS_Security_Feb14.pdf)。 - tanou
@tanou 在 Swift 中,CryptoKit 提供了更多可用的功能。 - TJ Olsen

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