是否可以在 iOS 上使用 AES128 和 GCM 模式?
Posted
技术标签:
【中文标题】是否可以在 iOS 上使用 AES128 和 GCM 模式?【英文标题】:Is it possible to use AES128 with GCM mode on iOS? 【发布时间】:2014-07-04 02:20:20 【问题描述】:所以我对 *** 天才的问题是:如果有办法(本机、库、框架等)使用 AES 加密数据(最好是 128,但也可以是 256)使用强经过身份验证的加密算法,比如说GCM模式?
问题很简短,我做了一些研究,我只找到了一个似乎支持它的库(RNCryptor),但它似乎也使用 密码而不是密钥(就像你提供密码并且图书馆制作了密钥),我不太喜欢这样,我更喜欢自己管理我的密钥。
我还查看了 CommonCryptor.h 并发现了那行,在我看来,这似乎是通用加密器源代码中 GCM 的唯一参考(但我可能错了,实际上我可能错了):
case kCCModeGCM: if((ref->symMode[direction].gcm = getCipherMode(cipher, mode, direction).gcm) == NULL) return kCCUnimplemented;
提前致谢!
【问题讨论】:
我们的 SecureBlackbox 支持 AES-GCM 并且可用于 ios。但这是未记录的功能,因此您需要在我们的论坛上索取示例。 【参考方案1】:RNCryptor 使用 HMAC,它被认为是一种创建身份验证标签的强密码方法。它也是开源的。所以我会认真考虑为此克隆 RNCryptor 代码(保持标题中的版权完整!)。
基于密码的加密包括派生密钥(可能还有 IV),然后执行加密和身份验证。所以你应该通过简单地删除密钥派生部分来获得很长的路要走。
唯一不起作用的情况是密钥派生代码被编入执行加密/身份验证的部分,但 RNCryptor 似乎并非如此。
【讨论】:
谢谢伙计!我听从了您的建议,实际上在 RNCryptor 中可以使用密钥并跳过密钥派生。然而,RNCryptor 不使用 GCM,而是使用 CBC,然后使用 HMAC+SHA1,但这符合我的要求。谢谢指导!【参考方案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
【讨论】:
【参考方案3】:CommonCrypto 中缺少 GCM。有趣的是,Apple 从 ios5 开始就使用 GCM 作为钥匙串。
【讨论】:
我对 CommonCrypto 中缺乏可用的模式/方法感到非常惊讶,同时看到其中大多数(或至少很多)被苹果在 iOS 中使用(images.apple.com/ipad/business/docs/iOS_Security_Feb14.pdf)以上是关于是否可以在 iOS 上使用 AES128 和 GCM 模式?的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 和 iPhone 中使用 AES-128 加密(不同的结果)