所以我对你的问题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;
先谢谢!
答案 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作为钥匙串。