是否可以在iOS上使用带有GCM模式的AES128?

时间:2014-05-15 14:43:39

标签: ios encryption cryptography aes aes-gcm

所以我对你的问题stackoverflow天才是:如果有一种方法(本机,库,框架,等等......)使用AES加密数据(最好是128,但也可能是256)使用强大的经过身份验证的加密算法,让我们说 GCM模式

问题很简短,我做了一些研究,我只发现了一个似乎支持它的库(RNCryptor)但它似乎也使用密码来代替密钥(就像你提供了一个密码而图书馆成了密钥而且我不喜欢这么做,我更愿意自己管理我的密钥

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

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

先谢谢!

3 个答案:

答案 0 :(得分:2)

RNCryptor使用HMAC,它被认为是一种加密强大的创建身份验证标记的方法。它也是开源的。所以我会认真考虑为此克隆RNCryptor代码(保持标题中的版权完整!)。

基于密码的加密包括导出密钥(可能还有IV),然后执行加密和身份验证。因此,您只需删除密钥派生部分即可获得很长的路要走。

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

答案 1 :(得分:2)

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

首先,在经过大量谷歌搜索之后,似乎Zaph是正确的,iOS并没有提供GCM,而是在iOS中使用它。参考:iOS Security feb 2014

其次,RNCryptor不使用GCM但在CBC模式下使用AES256(密码块链接),这很好,然后使用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 article但没有戏剧性,AES256还有其他观点是专业人士:Colin Percival article

答案 2 :(得分:1)

CommonCrypto缺少GCM。有趣的是,自从ios5以来,Apple正在使用GCM作为钥匙串。