我在 Secure Enclave 中生成并存储了一对私钥/公钥。
256位椭圆曲线 key 。 (唯一可以存储在 Secure Enclave 中的 key 类型)。
我使用 SecKeyCreateWithData
和 SecKeyCopyExternalRepresentation
在 iOS 设备之间导入/导出公钥,并且有效。
但是,导出的 key 似乎不适用于 OpenSSL。
因为它总是在这个命令上显示 'unable to load Key'
。
openssl ec -pubin -in public_key_file -text
导出 key 的方式是什么?所以我可以将它与 OpenSSL 一起使用。
最佳答案
要使用 OpenSSL,您需要主题公钥信息 (SPKI)
,DER
或 PEM
格式。
SPKI 包含基本信息,例如,key.type
、key.parameters
、key.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
它总是由两部分组成
固定架构 header
3059301306072a8648ce3d020106082a8648ce3d030107034200
原始键值
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/