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

问题描述 投票:0回答:1
  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:加密:ECIES:ECDH:KDFX963:SHA1:AESGCM:密钥不支持的算法

swift security encryption cryptography
1个回答
0
投票

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

请注意,错误中算法的描述表明使用

ECIES:ECDH:KDFX963:SHA1:AESGCM
执行包装。目前您提供的是 RSA 密钥,而不是所需的椭圆曲线密钥。

算法的意思是:

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

信息量很大,但最终得出结论,只有 ECDH 需要另一个输入参数:EC 公钥。该方案使用 GCM 模式下的 AES 进行加密,因此原则上要包装的密钥的大小并不重要。

结果是包装密钥需要是正确的类型,因为 ECDH 永远不会与 RSA 密钥一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.