Проблема с созданием пары ключей EC PEM на iOS в Swift с использованием платформы безопасности.IOS

Программируем под IOS
Ответить
Anonymous
 Проблема с созданием пары ключей EC PEM на iOS в Swift с использованием платформы безопасности.

Сообщение Anonymous »

Я хочу сгенерировать такую ​​же пару ключей, как результат следующей команды openssl:
openssl ecparam -genkey -name prime256v1 -noout -out ec256-key-pair.pem
openssl ec -in ec256-key-pair.pem -pubout > my-public-ec.pem

Когда я проверяю результат:
openssl pkey -pubin -in my-public-ec.pem -text -noout

Я получаю:
Public-Key: (256 bit)
pub:
04:fc:7a:1d:5a:2d:8b:c9:ff:47:cc:56:ae:66:37:
4b:5d:69:d9:d4:9a:10:72:30:e5:2d:2e:9d:86:19:
30:2a:44:4e:b2:04:09:8f:d3:89:3a:5d:5e:f2:32:
c7:70:12:bb:55:18:28:c1:a7:2d:d4:1c:e6:9b:12:
46:4d:98:07:1b
ASN1 OID: prime256v1
NIST CURVE: P-256

Теперь я хочу сделать то же самое в Swift:
Для этого я использую следующий код:
func generateKeys() throws -> (privateKey: SecKey, publicKey: SecKey) {
let query: [String: Any] = [
kSecAttrKeyType as String: kSecAttrKeyTypeEC,
kSecAttrKeySizeInBits as String: 256,
kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
kSecAttrIsPermanent as String: false
]

var error: Unmanaged?

guard let privateKey = SecKeyCreateRandomKey(query as CFDictionary, &error) else {
throw error as! any Error
}
let publicKey = SecKeyCopyPublicKey(privateKey)!
return (privateKey, publicKey)

}

Это выполняется без ошибок.
Далее я генерирую пару ключей и печатаю открытый ключ в формате PEM:
extension SecKey {
func exportBase64EncodedKey() -> String {
var error: Unmanaged?
guard let data = SecKeyCopyExternalRepresentation(self, &error) else {
fatalError("Failed to export key: \(error!.takeRetainedValue())")
}
return (data as Data).base64EncodedString(options: [.lineLength64Characters])
}
}

func printPublicKey() {
let keyPair = try! generateKeys()
let encodedPublicKey = keyPair.publicKey.exportBase64EncodedKey()
var header = "-----BEGIN PUBLIC KEY-----"
var footer = "-----END PUBLIC KEY-----"
var pemKey = "\(header)\n\(encodedPublicKey)\n\(footer)\n"
print(pemKey)

}

printPublicKey()

Это напечатает что-то вроде:
-----BEGIN PUBLIC KEY-----
BJe2Tq7I1H6gbzcTW0Mq8c8FOhOakEbq6EPQXYSnlDF4IHHyzlERs6YUdcwy8KvT
fuNHfOQ7b3ITi5FFHcCXmps=
-----END PUBLIC KEY-----

Если я скопирую это в файл pem и запущу ту же команду:
openssl pkey -pubin -in new_public_key.pem -text -noout

Я получаю следующую ошибку:
Could not find private key of Public Key from new_public_key.pem
404278EC01000000:error:1E08010C:DECODER routines:OSSL_DECODER_from_bio:unsupported:crypto/encode_decode/decoder_lib.c:102:No supported data to decode.

Что я делаю не так?
Выполняю приведенный выше код со следующими параметрами:
kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
kSecAttrKeySizeInBits as String: 1024,


В результате получается открытый ключ, который Openssl может без проблем проанализировать.
Для удобства тестирования этот код можно скопировать и вставить в Swift Playground, чтобы запусти его:
import Foundation
import Security
import CryptoKit

func generateKeys() throws -> (privateKey: SecKey, publicKey: SecKey) {
let query: [String: Any] = [
kSecAttrKeyType as String: kSecAttrKeyTypeEC,
kSecAttrKeySizeInBits as String: 256,
kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
kSecAttrIsPermanent as String: false
]

var error: Unmanaged?

guard let privateKey = SecKeyCreateRandomKey(query as CFDictionary, &error) else {
throw error as! any Error
}
let publicKey = SecKeyCopyPublicKey(privateKey)!
return (privateKey, publicKey)

}

extension SecKey {
func exportBase64EncodedKey() -> String {
var error: Unmanaged?
guard let data = SecKeyCopyExternalRepresentation(self, &error) else {
fatalError("Failed to export key: \(error!.takeRetainedValue())")
}
return (data as Data).base64EncodedString(options: [.lineLength64Characters])
}
}

func printPublicKey() {
let keyPair = try! generateKeys()
let encodedPublicKey = keyPair.publicKey.exportBase64EncodedKey()
var header = "-----BEGIN PUBLIC KEY-----"
var footer = "-----END PUBLIC KEY-----"
var pemKey = "\(header)\n\(encodedPublicKey)\n\(footer)\n"
print(pemKey)
}

printPublicKey()


Подробнее здесь: https://stackoverflow.com/questions/793 ... -framework
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»