Цель C: экспорт закрытого и открытого ключа из цепочки для ключей
Я могу создать публично-частную пару ключей, используя SecKeyGeneratePair
Функция [Apple CryptoExercise].
Q1. Ключи в цепочке для ключей отображаются как без отображения имени. Как мы можем добавить понятное имя для ключей.
Q2. Однако, как я могу экспортировать открытый и закрытый ключ, который был сгенерирован в пригодном для использования формате:
-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqCWtYiGnhAv...
-----END RSA PUBLIC KEY-----
а также:
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
Обратите внимание, что их можно вручную экспортировать из цепочки для ключей, но как этого можно достичь, используя цель C Apis.
Любая помощь будет заметна.
Здесь есть аналогичный вопрос, но без какого-либо ответа: iPhone: как экспортировать SecKeyRef или NSData, содержащие биты открытого ключа, в формат PEM? Нет необходимости использовать OpenSSL только для этой цели.
2 ответа
Может быть, вы могли бы сослаться на эти документы от Apple:
Получение объекта SecKeyRef для криптографии с открытым ключом и Руководства для программиста сертификатов, ключей и служб доверия
Получение объекта SecKeyRef для криптографии с открытым ключом
Извлечение ключей из цепочки для ключей Если вы используете существующие открытые и закрытые ключи из цепочки для ключей, прочитайте Руководство по программированию сертификатов, ключей и доверенных служб, чтобы узнать, как извлечь объект SecKeychainItemRef для этого ключа.
Получив SecKeychainItemRef, вы можете преобразовать его в SecKeyRef для использования с этим API.
Импорт существующих открытых и закрытых ключей Импорт и экспорт пар открытых и закрытых ключей несколько сложнее, чем генерация новых ключей из-за большого количества различных форматов ключей в общем использовании.
В этом примере описывается, как импортировать и экспортировать пару ключей в формате PEM (Privacy Enhanced Mail).
Чтобы экспортировать ключи в объект CFDataRef
- Создайте и заполните массив использования ключа.
- Создайте и заполните массив ключевых атрибутов.
- Задайте поля использования ключа и атрибутов в объекте параметров.
- Установите внешний формат и значения флага соответственно.
- Экспортируйте ключ с помощью API следующим образом.
OSStatus oserr = SecItemExport(publickey, externalFormat, // See SecExternalFormat for details flags, // See SecItemImportExportFlags for details ¶ms, (CFDataRef *)&pkdata); if (oserr) { fprintf(stderr, "SecItemExport failed (oserr=%d)\n", oserr); exit(-1); }
Q1. Как мы можем добавить понятное имя для ключей?
Используйте ключ kSecAttrLabel для передачи метки в словаре параметров SecKeyGeneratePair()
,
Q2. Как экспортировать ключи в формат PEM?
Формат PEM - это те же данные, что и файл в кодировке DER, но он кодируется в base64 с дополнительными строками верхнего и нижнего колонтитула. Данные в формате DER могут быть получены с использованием параметра kSecFormatX509Cert и флага kSecItemPemArmour при вызове SecItemExport()
,
CFTypeRef key = NULL; // your key
CFDataRef data;
SecItemExport(key, kSecFormatX509Cert, kSecItemPemArmour, NULL, &data);
NSString* base64EncodedString = [(__bridge NSData*)data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSString* pemString = [NSString stringWithFormat:@"-----BEGIN FOO BAR KEY-----\n%@\n-----END FOO BAR KEY-----", base64EncodedString];
NSData* pemData = [pemString dataUsingEncoding:NSUTF8StringEncoding];