ios - 从 iOS 导出椭圆曲线 key 以使用 OpenSSL

标签 ios swift security

我在 Secure Enclave 中生成并存储了一对私钥/公钥。

256位椭圆曲线 key 。 (唯一可以存储在 Secure Enclave 中的 key 类型)。

我使用 SecKeyCreateWithDataSecKeyCopyExternalRepresentation 在 iOS 设备之间导入/导出公钥,并且有效。

但是,导出的 key 似乎不适用于 OpenSSL。 因为它总是在这个命令上显示 'unable to load Key'

openssl ec -pubin -in public_key_file -text

导出 key 的方式是什么?所以我可以将它与 OpenSSL 一起使用。

最佳答案

要使用 OpenSSL,您需要主题公钥信息 (SPKI)DERPEM 格式。

SPKI 包含基本信息,例如,key.typekey.parameterskey.value

SecKeyCopyExternalRepresentation 只返回原始 key 二进制文件,它只是 key.value 部分。

您必须从那个 key.value 创建 SPKI。执行此操作的正常方法是阅读 https://www.rfc-editor.org/rfc/rfc5480 , 并将 ASN.1 结构编码为二进制编码的 DER 格式。


但这里有一个捷径。

Secure Enclave 仅支持一种 key 类型,256 位 EC key secp256r1(相当于 OpenSSL 中的 prime256v1)。

DER格式的SPKI是二进制编码的数据,例如

3059301306072a8648ce3d020106082a8648ce3d03010703420004fad2e70b0f70f0bf80d7f7cbe8dd4237ca9e59357647e7a7cb90d71a71f6b57869069bcdd24272932c6bdd51895fe2180ea0748c737adecc1cefa3a02022164d

它总是由两部分组成

  1. 固定架构 header 3059301306072a8648ce3d020106082a8648ce3d030107034200

  2. 原始键值04.......

您可以通过组合这两个部分来创建 SPKI。

spki = fixed_schema_header + SecKeyCopyExternalRepresentation(...)


func createSubjectPublicKeyInfo(rawPublicKeyData: Data) -> Data {
    let secp256r1Header = Data(bytes: [
        0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a,
        0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00
        ])
    return secp256r1Header + rawPublicKeyData
}

// Usage
let rawPublicKeyData = SecKeyCopyExternalRepresentation(...)!
let publicKeyDER = createSubjectPublicKeyInfo(rawPublicKeyData: rawPublicKeyData)
write(publicKeyDER, to: "public_key.der")

// Test with OpenSSL
// openssl ec -pubin -in public_key.der -text -inform der

关于ios - 从 iOS 导出椭圆曲线 key 以使用 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131935/

相关文章:

ios - 游戏中心显示 "NO ITEMS"

ios - 以图形方式将对象添加到核心数据

xcode - 你怎么知道一个 Swift 类是从另一个类继承还是符合协议(protocol)?

android - 应用程序的用户可以看到 https 数据包中的内容吗?

android - 其他应用程序可以访问帐户管理器中的用户数据

java - FTP 连接(Java)

iphone - Objective-C 中是否可以随机生成 tmx( map )文件?

ios - 使用 Stripe 的 Apple Pay 将 token 发送到服务器并收取购买费用

ios - 自动签名无法解决 "Project"目标权利的问题

swift - 如何使 Swift 框架子模块真正私有(private)?