Цель 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

  1. Создайте и заполните массив использования ключа.
  2. Создайте и заполните массив ключевых атрибутов.
  3. Задайте поля использования ключа и атрибутов в объекте параметров.
  4. Установите внешний формат и значения флага соответственно.
  5. Экспортируйте ключ с помощью API следующим образом.
OSStatus oserr = SecItemExport(publickey,
    externalFormat, // See SecExternalFormat for details
    flags, // See SecItemImportExportFlags for details
    &params,
    (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];
Другие вопросы по тегам