提问人:nirav 提问时间:11/10/2023 最后编辑:Joakim Danielsonnirav 更新时间:11/10/2023 访问量:60
使用 Wrapped 密钥进行加密在 Swift 中不起作用
Encryption with Wrapped key not working in Swift
问:
- 首先,我生成了 512 位密钥,称为“Wrapped Key”并保存到钥匙串中
- 生成另一个 512 位密钥的密钥,称为“私钥”
- 将这个“私钥”转换为数据,数据计数为 319 字节
- 从钥匙串中检索“包装的密钥”
- 从“Wrapped Key”获取公钥
- 尝试使用“Wrapped Key”(公钥)加密数据的“私钥”
- 到目前为止,我尝试过的任何算法都会出错。
我的代码如下:
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),
答:
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脚本生成私钥并保存到钥匙串中吗?
评论