Я хочу сгенерировать такую же пару ключей, как результат следующей команды 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
Проблема с созданием пары ключей EC PEM на iOS в Swift с использованием платформы безопасности. ⇐ IOS
Программируем под IOS
1736440790
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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79343297/problem-generating-ec-pem-keypair-on-ios-in-swift-using-security-framework[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия