4

所以我对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;

提前感谢!

4

3 回答 3

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];

然后用这个解密

NSData *decryptedData = [RNDecryptor decryptData:encryptedData withEncryptionKey:encryptionKey HMACKey:HMACKey error:&decryptionError];

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

注意:使用 AES256 时要小心,密钥时间表可能很弱:Schneier 文章但没有戏剧性,还有其他关于 AES256 的观点是专业的:Colin Percival 文章

于 2014-05-16T13:11:18.800 回答
2

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

基于密码的加密包括派生密钥(可能还有 IV),然后执行加密和身份验证。所以你应该通过简单地删除密钥派生部分来获得很长的路要走。

唯一不起作用的情况是密钥派生代码被编织到执行加密/身份验证的部分中,但对于 RNCryptor 似乎并非如此。

于 2014-05-15T15:34:28.963 回答
1

CommonCrypto 中缺少 GCM。有趣的是,Apple 从 ios5 开始就使用 GCM 作为钥匙串。

于 2014-05-15T14:59:49.213 回答