【问题标题】:SecKeyCreateWithData Returns ‘Nil’ with ErrorSecKeyCreateWithData 返回“Nil”并出现错误
【发布时间】:2021-09-18 21:59:29
【问题描述】:

我们正在尝试从“.der”文件创建“SecKey”。但是“SecKeyCreateWithData”总是抛出“Nil”并出现错误。

遵循的步骤::

首先,我们使用以下命令创建了一个 ECDSA 私钥和公钥对,然后将保存私钥的 .pem 文件转换为“.der”文件。最后使用‘.der’文件通过代码生成‘SecKey’。

用于生成私钥和公钥的命令::

openssl ecparam -genkey -name prime256v1 -noout -out ec-key-pair.pem

openssl ec -in ec-key-pair.pem -pubout -out ec-key-pair.pub

用于生成 .Der 文件的命令::

openssl pkey -outform der -in ec-key-pair.pem -out ec-key-pair.der

.pem 文件内的内容::

-----开始EC私钥-- MHcCAQEEIKJTc3zI8D07Myh7ZIR+wGyQgsjEeKdH0+hSiErK5AjzoAoGCCqGSM49 AwEHoUQDQgAEvbOBrM/D2fX05zKQYuJiTRP6YiUBabImrHb9s+OHimxUxX+E9jVe oQ6nxSOkfgm0H1OjLfp2xGLqkDTuF38UGQ== -----结束EC私钥-----

收到错误::

非托管 - _value : Error Domain=NSOSStatusErrorDomain Code=-50 "从数据创建 EC 私钥失败" UserInfo={NSDescription=从数据创建 EC 私钥失败}

使用的最小部署目标::

iOS 14.0

使用的代码::

    if let certificateData = NSData(contentsOf:Bundle.main.url(forResource: "ec-key-pair", withExtension: "der")! ) {
            var error: Unmanaged<CFError>? = nil
            let privateSecKey = SecKeyCreateWithData(certificateData , [
                   kSecAttrKeyType: kSecAttrKeyTypeEC,
                   kSecAttrKeyClass: kSecAttrKeyClassPrivate] as NSDictionary, &error)
}

【问题讨论】:

    标签: ios swift ecdsa


    【解决方案1】:

    您似乎没有以正确的格式传递密钥。您正在传递 ASN.1 DER,SecKeyCreateWithData 期望的格式在这里解释:https://developer.apple.com/documentation/security/1643698-seckeycopyexternalrepresentation

    对于椭圆曲线私钥,输出格式为公钥与秘密标量的大端编码或04 || X || Y || K 串联。

    不知道有没有办法直接从 OpenSSL 生成所需的格式。您可能需要进行一些解析!

    【讨论】:

      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 2013-10-06
      • 2013-10-25
      • 1970-01-01
      • 2016-08-13
      • 2011-04-07
      • 2016-01-01
      相关资源
      最近更新 更多