是否可以在 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 模式?的主要内容,如果未能解决你的问题,请参考以下文章

IOS AES加密之ECB128模式

在 Android 和 iPhone 中使用 AES-128 加密(不同的结果)

iOS之AES加密解密

iOS AES128加密解密的两种模式(CBC和ECB)

有没有办法在没有 iv 的情况下在 openssl 中运行 aes-128-cbc 加密?

是否可以在TLSv1.2会话中使用TLSv1.3密码?