РЕДАКТИРОВАТЬ: Используя приведенный ниже метод, мы смогли импортировать ключи размером до 4096. Любой размер ключа RSA, превышающий этот, по-видимому, отклоняется цепочкой для ключей. Мы возвращаем статус успеха, но не получаем ссылку на ключ.
Небольшое примечание относительно импорта закрытых / открытых ключей RSA. В моем случае мне нужно было импортировать закрытый ключ, сгенерированный OpenSSL.
Этот проект выполняет большую часть того, что я хотел как положить его в брелок. Как вы можете видеть, у него просто есть ключевые данные, в которые вы вставляете ключевые данные, а цепочка ключей определяет размер блока и т. Д. Из ключа. Связка ключей поддерживает ключ в кодировке ASN.1.
Когда вы экспортируете ключ в файл, это, скорее всего, файл PEM. Файл PEM - это просто структура DER в кодировке base64. Структура DER является обобщенной структурой, но в случае OpenSSL это обычно закрытый или открытый ключ в кодировке ASN.1.
Структура ASN.1 довольно хорошо отображается здесь. ПОЖАЛУЙСТА, прочтите и поймите, как читать структуру ASN.1, прежде чем пытаться возиться с ней, иначе импорт ключа другого размера не удастся.
У меня явно недостаточно «репутации», чтобы размещать более двух ссылок. Итак, для следующего примера вставьте информацию base64 (все, кроме --- BEGIN * KEY --- и --- END * KEY --- в: lapo.it/asn1js.
Если вы посмотрите на проект iOS, который я связал, вы увидите, что они включают образцы ключей. Вставьте закрытый ключ в декодер ASN.1. Вы заметите, что у вас есть тег SEQUENCE, за которым следует несколько значений INTEGER.
Теперь вставьте открытый ключ. Вы заметите, что у открытого ключа есть две части информации, общие с секретным ключом. Модуль и показатель степени. В закрытом ключе это второе и третье значения INTEGER. Также вверху есть некоторая информация. Он имеет 2 дополнительных ПОСЛЕДОВАТЕЛЬНОСТИ, теги OBJECT ID, NULL и BIT STRING.
Вы также заметите в проекте, что он вызывает специальную функцию для обработки этого открытого ключа. Он удаляет всю информацию заголовка до самого внутреннего тега SEQUENCE. В этот момент он обращается с ним точно так же, как с закрытым ключом, и может поместить его в связку ключей.
Почему это для одного, а не для другого? Посмотрите на текст верхнего и нижнего колонтитула. В закрытом ключе написано --- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ RSA ---, в открытом ключе указано --- НАЧАТЬ ОБЩЕСТВЕННЫЙ КЛЮЧ ---. В открытом ключе вы увидите идентификатор объекта: 1.2.840.113549.1.1.1. Это идентификатор, который представляет собой статический тег, идентифицирующий содержащийся ключ как ключ типа RSA.
Поскольку в преамбуле закрытого ключа есть RSA, предполагается, что это ключ RSA, и информация ASN.1 в заголовке не требуется для идентификации ключа. Открытый ключ - это просто общий ключ, поэтому требуется заголовок, чтобы определить, какой это тип ключа.
Связка ключей НЕ будет импортировать ключ RSA с этим заголовком ASN.1. Вам нужно полностью разделить его до последней ПОСЛЕДОВАТЕЛЬНОСТИ. На этом этапе вы можете поместить его в цепочку для ключей, и цепочка для ключей смогла получить размер блока и другие ключевые атрибуты.
Поэтому, если есть BEGIN RSA PRIVATE KEY, вам не нужно выполнять удаление. Если это - BEGIN PRIVATE KEY ---, вам нужно будет удалить эти начальные заголовки, прежде чем помещать их в связку ключей.
В моем случае мне также понадобился открытый ключ. Мы не могли придумать способ получить его из связки ключей после того, как успешно вставили закрытый ключ (возможно, мы просто что-то пропустили), поэтому мы фактически создали открытый ключ ASN.1 из закрытого ключа и импортировали его в keycahin.
В закрытом ключе (после удаления заголовка ASN.1) у вас будет тег SEQUENCE, за которым следуют 3 тега INTEGER (после этого идут еще INTEGERS, но первые 3 - это все, о чем мы заботимся).
Первый - это тег VERSION. Второй - это модуль, а третий - публичный показатель.
Глядя на открытый ключ (после удаления заголовка ASN.1), вы видите SEQUENCE, за которым следует 2 INTEGERS. Как вы уже догадались, это модуль и публичная экспонента от закрытого ключа.
Итак, все, что вам нужно сделать, это:
- Возьмите модуль и публичную экспоненту из закрытого ключа
- Создайте тег SEQUENCE в буфере и установите его длину равной [длина модуля] + [длина экспоненты]. (При записи этих байтов в буфер вам, скорее всего, потребуется изменить порядок байтов в обратном порядке. По крайней мере, я сделал.)
- Добавьте данные модуля, которые вы взяли из закрытого ключа
- Добавьте данные экспоненты, которые вы взяли из закрытого ключа
Это все, что вам нужно сделать, чтобы создать открытый ключ из импортированного вами закрытого ключа. Кажется, не так много информации для импорта ключей RSA, которые вы не генерируете на устройстве, и я слышал, что ключи, сгенерированные на устройстве, НЕ содержат этих заголовков ASN.1, но я никогда не пробовал . Наши ключи довольно большие, и на их создание у устройства уходит слишком много времени. Единственный вариант, который я когда-либо нашел, - это использовать OpenSSL, где вам нужно скомпилировать свой собственный для iOS. Я бы предпочел использовать фреймворк безопасности там, где это возможно.
Я все еще новичок в разработке iOS, и я уверен, что кто-то знает простую функцию, которая делает все это, что я не мог найти, и я СМОТРЕЛ. Кажется, это работает нормально, пока не станет доступен более простой API для обработки ключей.
И последнее замечание: закрытый ключ, включенный в проект, имел тег BIT STRING, но тот, который я импортирую из закрытого ключа, сгенерированного OpenSSL, имел тег OCTET STRING.
person
Mrbass21
schedule
02.10.2014