Я пытаюсь извлечь 1024-битный открытый ключ RSA из уже сгенерированной пары ключей (два SecKeyRef
s), чтобы отправить его по сети. Все, что мне нужно, это простая пара (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
RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e }
См. PKCS-1 - person President James K. Polk   schedule 17.10.2012