在 iOS 中使用 GMEllipticCurveCrypto 和 CryptoKit 的 ECDH 公钥的类型转换错误

Type conversion error using ECDH public key at GMEllipticCurveCrypto and CryptoKit in iOS

提问人:dickfala 提问时间:10/20/2023 更新时间:10/20/2023 访问量:74

问:

我正在集成代码,我将从“GMEllipticCurveCrypto”框架获取公钥,如下所示:

[Objective-C]
GMEllipticCurveCrypto *crypto = [GMEllipticCurveCrypto generateKeyPairForCurve:
                                     GMEllipticCurveSecp384r1];
NSLog(@"public base64:%@",crypto.publicKeyBase64);
// output : AmIh8odxIxJ93mdBOjxW9zP0DhIP29YejHyVwDkiKfNEm26sfPgq3yD86ttt826uyQ==

,但我想使用 Swift 的 CryptoKit 将这个公钥转换为 P384 类型。KeyAgreement.PublicKey。 但是,我遇到以下错误。

[Swift]
let base64CompressedPublicKeyString = "AmIh8odxIxJ93mdBOjxW9zP0DhIP29YejHyVwDkiKfNEm26sfPgq3yD86ttt826uyQ=="

if let compressedPublicKeyData = Data(base64Encoded: base64CompressedPublicKeyString) {

do {
   
        let publicKey = try P384.Signing.PublicKey(rawRepresentation: compressedPublicKeyData)
        
        print("create P-384 ECDH public key:\(publicKey)")
    } catch {
        print("cant’t create:\(error)")
    }
} else {
    print("Base64 decode” fail")
}

我收到了下面的错误日志:

"cant’t create:incorrectParameterSize"

如何调整以将收到的公钥转换为 P384。KeyAgreement 类型,然后生成带有私钥的共享密钥?

IOS版 SWIFT Objective-C ECDH

评论

0赞 Topaco 10/20/2023
Base64 解码密钥0x026221...AEC9 以压缩格式给出。第 1 个字节 (0x02) 表示密钥的 y 坐标为偶数,以下 48 个字节(P-384 的大小)是密钥的 x 坐标(其中 x 与 y 为偶数的信息一起,可以导出 y)。因此,我怀疑 compressedRepresentation 而不是必须用于密钥导入。rawRepresentation
0赞 Carl Lindberg 10/23/2023
如前所述,可以对 EC 密钥进行编码的几种格式。你可以要求 GMEllipticCurveCrypto 给你一个未压缩的密钥(将其 compressedPublicKey 属性设置为 NO),或者告诉 CryptoKit 期待压缩的形式。

答: 暂无答案