2017-07-16 99 views
1

我有一個私有/公鑰對生成並存儲在Secure Enclave中。從iOS導出橢圓曲線密鑰以使用OpenSSL

它是256位橢圓曲線密鑰。 (唯一可以存儲在Secure Enclave中的密鑰類型)。

我使用SecKeyCreateWithDataSecKeyCopyExternalRepresentation來導入/導出iOS設備之間的公鑰,它工作。

但是,導出的密鑰似乎不適用於OpenSSL。 因爲它總是顯示'unable to load Key'這個命令。

openssl ec -pubin -in public_key_file -text 

什麼是導出密鑰的方式嗎?所以我可以在OpenSSL中使用它。

回答

1

要使用OpenSSL,您需要subject public key info (SPKI),或者DERPEM格式。

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

SecKeyCopyExternalRepresentation只返回原始密鑰二進制,它只是key.value部分。您需要從key.value創建SPKI。執行此操作的正常方法是讀取https://tools.ietf.org/html/rfc5480,並將ASN.1結構編碼爲二進制編碼的DER格式。


但是,這裏有一條捷徑。

Secure Enclave僅支持一種密鑰類型,256位EC密鑰secp256r1(相當於OpenSSL中的prime256v1)。

DER格式的SPKI是二進制編碼的數據,例如,

3059301306072a8648ce3d020106082a8648ce3d03010703420004fad2e70b0f70f0bf80d7f7cbe8dd4237ca9e59357647e7a7cb90d71a71f6b57869069bcdd24272932c6bdd51895fe2180ea0748c737adecc1cefa3a02022164d 

它總是由兩個部分組成

  1. 固定模式頭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