iOS SecItemCopyMatching формат открытого ключа RSA?

Я пытаюсь извлечь 1024-битный открытый ключ RSA из уже сгенерированной пары ключей (два SecKeyRefs), чтобы отправить его по сети. Все, что мне нужно, это простая пара (modulus, exponent), которая должна занимать ровно 131 байт (128 для модуля и 3 для экспоненты).

Однако, когда я беру ключевую информацию как объект NSData, я получаю 140 бит вместо 131. Вот пример результата:

<30818902 818100d7 514f320d eacf48e1 eb64d8f9 4d212f77 10dd3b48 ba38c5a6
 ed6ba693 35bb97f5 a53163eb b403727b 91c34fc8 cba51239 3ab04f97 dab37736
 0377cdc3 417f68eb 9e351239 47c1f98f f4274e05 0d5ce1e9 e2071d1b 69a7cac4
 4e258765 6c249077 dba22ae6 fc55f0cf 834f260a 14ac2e9f 070d17aa 1edd8db1
 0cd7fd4c c2f0d302 03010001>

После нескольких повторных попыток генерации ключа и сравнения полученных NSData объектов байты, которые остаются одинаковыми для всех ключей, - это первые 7:

<30818902 818100>

Последние три байта выглядят как показатель степени (65537, обычное значение). Между «модулем» и показателем степени также есть два байта:

<0203>

Может ли кто-нибудь с большим опытом криптовалюты помочь мне определить, что это за кодировка? DER? Как правильно декодировать модуль и показатель степени?

Я попытался вручную удалить модуль и показатель степени, используя

NSData* modulus = [keyBits subdataWithRange:(NSRange){ 7, 128 }];
NSData* exponent = [keyBits subdataWithRange:(NSRange){ 7 + 128 + 2, 3 }];

но я получаю ошибки при попытке расшифровать данные, которые удаленный хост закодировал с помощью этого «ключа».

РЕДАКТИРОВАТЬ:

Вот суть решения, которое я использовал для распаковки большого двоичного объекта RSA: https://gist.github.com/vl4dimir/6079882


person Vladimir Mitrovic    schedule 17.10.2012    source источник
comment
Это кодировка DER этого распространенного формата открытого ключа ASN.1 RSA: RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e } См. PKCS-1   -  person President James K. Polk    schedule 17.10.2012


Ответы (1)


Предполагая, что вы хотите, чтобы решение работало под iOS, взгляните на эта ветка. Сообщение подтверждает, что используется кодировка DER, и показывает, как извлечь показатель степени и модуль из объекта NSData, с которого вы начали.

Есть еще одно решение, которое не будет работать на iOS, но будет работать на настольных системах (включая MacOS X), в которых установлен OpenSSL в эту ветку. Даже если вы ищете решение только для iOS, вы все равно можете использовать его, чтобы убедиться, что ваш код работает правильно.

person user8472    schedule 17.10.2012
comment
Спасибо. По сути, его код возвращает тот же ключ, что и решение методом грубой силы, которое я использовал, поэтому проблема должна быть где-то еще в моем коде. - person Vladimir Mitrovic; 17.10.2012