2014-12-19 4 views
5

У меня есть модуль & показатель открытого ключа RSA, встроенный в двоичный файл, и я пытаюсь извлечь весь блок и создать полезный. открытый ключ.как преобразовать необработанный модуль и показатель экспоненты в открытый ключ RSA (формат .pem)

В настоящее время я извлекаю полные 260 байтов (4 байта для показателя, 256 байт для модуля) и кодировку как base64. Я делаю это с помощью следующей команды оболочки:

tail -c $((filesize - start_of_key_data)) filename | head -c $size_of_key_data | base64 > outkey 

Это дает мне следующую строку:

<<<<<< modulus & exponent extracted from binary file, base64-encoded >>>>>> 

tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4F 
vzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+ 
sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1Lll 
RWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/r 
ZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE= 

Теперь, когда я беру key.pem ключей, что модуль & показатель первоначально были извлечены из и отображать открытую часть, как так

openssl rsa -in key.pem -pubout -out pubkey.pem 

я получаю эту строку (я опустил нижние колонтитулы заголовка &:

<<<<<<<<< valid public key data extracted from keypair >>>>>>>>> 

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtZyrQA6cZFJfVm6FyXwt 
ZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZ 
U71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDv 
YDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGy 
a9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx4 
1YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ 
ZwIDAQAB 

Вы можете видеть, что основные данные, которые я извлек и кодировке base64 сам является на самом деле присутствует в данных действительных открытых ключей данных, извлеченных из key.pem с использованием OpenSSL. Однако есть 45 символов в начале, что мои собственные Извлеченные данные не -

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 

и последние 8 символов также различаются.

ZwIDAQAB 

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

(цель, чтобы сделать это в Баш скрипт, а не Python или C, как я видел, что многие предполагают.)

ответ

9

Command, который вы использовали, openssl rsa -in key.pem -pubout -out pubkey.pem, производит структуру ASN.1, как это:

SEQUENCE(2 elem) 
    SEQUENCE(2 elem) 
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1 
    NULL 
    BIT STRING(1 elem) 
    SEQUENCE(2 elem) 
     INTEGER(2048 bit) 229263895356027367204242482830890190076375310244080661230946245232688… 
     INTEGER 65537 

(Вы можете увидеть структуру с openssl asn1parse -in pubkey.pem или используя online ASN.1 decoder).

It содержание:

  1. фиксированный заголовок (содержит все байты, указав кодировку всей последовательности плюс кодирование модуля)
  2. модуль
  3. заголовка, указав кодировку показателя
  4. показатель

Если у вас есть модуль и показатель байтов с правильно собранный, вы можете построить открытый ключ в форме, понятный OpenSSL, путем объединения этих четырех вещей. У вас уже есть первый более длинный заголовок."Средний заголовок" является '02 03' :

  1. '02' для целого
  2. длина самого целого числа 3 байта (65537 = 01 00 01)

Если ваш модуль 2048 байт и показатель 3 байта (так что поля длины остаются в силе), файл PEM может быть получен путем конкатенации эти четыре:

<header> <modulus> 0x02 0x03 <exponent> 

Вот почему последние байты из бинарного дампа отличаются от outpu OpenSSL t: извлеченные 260 байтов не содержат 02 03, а вместо этого записывают 65537 как 00 01 00 01 (не 01 00 01, как в кодировке ASN.1).

Подводя итог, можно создать файл PEM, как это: (! Отметить смещения байта пропустить ведущие нулевые байты 65537)

Преобразования извлеченного модуля + экспоненту обратно из base64 и извлечь их :

echo 'tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE=' | base64 -d > modulus-exp.bin 
dd if=modulus-exp.bin of=modulus.bin bs=1 count=256 
dd if=modulus-exp.bin of=exponent.bin bs=1 skip=257 count=3 

Создание заголовков:

echo 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA' | base64 -d > header.bin 
echo '02 03' | xxd -r -p > mid-header.bin 

Соединить их вместе:

cat header.bin modulus.bin mid-header.bin exponent.bin > key.der 

Преобразовать в PEM:

openssl pkey -inform der -outform pem -pubin -in key.der -out key.pem 

тест, который вы получите рабочий ключ - путем проверки его с ASN.1 декодером, или по

openssl asn1parse -in key.pem 
openssl asn1parse -in key.pem -strparse 19 
+0

потрясающий ответ! –

Смежные вопросы