使用 Wrapped 密钥进行加密在 Swift 中不起作用

Encryption with Wrapped key not working in Swift

提问人:nirav 提问时间:11/10/2023 最后编辑:Joakim Danielsonnirav 更新时间:11/10/2023 访问量:60

问:

  1. 首先,我生成了 512 位密钥,称为“Wrapped Key”并保存到钥匙串中
  2. 生成另一个 512 位密钥的密钥,称为“私钥”
  3. 将这个“私钥”转换为数据,数据计数为 319 字节
  4. 从钥匙串中检索“包装的密钥”
  5. 从“Wrapped Key”获取公钥
  6. 尝试使用“Wrapped Key”(公钥)加密数据的“私钥”
  7. 到目前为止,我尝试过的任何算法都会出错。

我的代码如下:

    guard let privateKeyData = KeyManager.keyToData(key: privateKey)
         else {
                debugPrint("private Key Data not found")
                return
            }
            
            var error : Unmanaged<CFError>?
            let pubKey = SecKeyCopyPublicKey(wrappedKey)
            
            ///2. Encrypt Private key by Wrapped Key
            guard let encryptedPrivateKey = SecKeyCreateEncryptedData(pubKey!, .eciesEncryptionStandardX963SHA1AESGCM, data as CFData, &error) as Data? else {
                debugPrint("encryption error private key")
                debugPrint(error!.takeUnretainedValue())
                return
            }

错误:

UserInfo={numberOfErrorsDeep=0, NSDescription=algid:encrypt:ECIES:ECDH:KDFX963:SHA1:AESGCM:密钥不支持的算法 <SecKeyRef 算法 id:1,密钥类型:RSAPublicKey,版本:4,512 位(块大小:64),

SWIFT 安全 加密 加密

评论

0赞 Timmy 11/10/2023
你能编辑你的问题以包括你得到的错误吗?
0赞 nirav 11/10/2023
@Timmy,在问题中添加了错误
0赞 Timmy 11/10/2023
您是否尝试过使用 256 键?因为该错误表明您正在使用的算法不支持您的密钥。
1赞 nirav 11/10/2023
实际上,我只想使用特定的 512 位密钥,使用 256 位密钥可以@Timmy
0赞 Maarten Bodewes 11/10/2023
包装密钥是用于保护另一个密钥的密钥,称为包装密钥我认为在这篇文章中,您将两者混淆了。另外,我想知道如何使用 256 位 RSA 密钥实现这项工作。您应该只能使用 256 位 EC 包装密钥对和任何类型和大小的要包装的私钥。

答:

2赞 Maarten Bodewes 11/10/2023 #1

512 位 RSA 不安全,不应使用。RSA 使用时相对安全,密钥大小从 2048 位开始,提供 ~112 位的安全性,从 3072 位开始,提供 ~128 位的安全性。

请注意,错误中对算法的描述表明,包装是使用 执行的。目前,您提供的是 RSA 密钥,而不是所需的椭圆曲线密钥。ECIES:ECDH:KDFX963:SHA1:AESGCM

该算法意味着:

  • ECIES:使用密钥协议和对称算法的混合加密,在本例中为 ECDH 和 AES 模式
  • ECDH:这是通用密钥协议,需要提供 ECDH 公钥,这使用特定的密钥协议对 ECIES 进行参数化
  • KDFX963:用于从 ECDH 协议派生 (AES) 密钥的 KDF 构造,这将参数化 ECDH 密钥协议方案
  • SHA1:使用必要的哈希函数对 KDF 进行参数化
  • AESGCM:执行实际包装的加密算法,使用必要的对称密码对 ECIES 进行参数化

这是很多信息,但最终归结为只有 ECDH 需要另一个输入参数:EC 公钥。该方案在 GCM 模式下使用 AES 进行加密,因此原则上要包装的密钥的大小无关紧要。

结果是包装密钥需要具有正确的类型,因为 ECDH 永远不会与 RSA 密钥一起使用。尝试使用 EC 密钥对,例如使用曲线 P-256。如果您想要 ~512 位 EC 密钥提供 256 位安全性,您可以使用 P-521(不是错别字)。

评论

0赞 nirav 11/17/2023
你知道我们如何在构建时使用iOS中的shell脚本生成私钥并保存到钥匙串中吗?