2014-12-19 36 views
5

Mam moduł publiczny & wykładnik klucza publicznego RSA osadzony w pliku binarnym, a ja próbuję wyodrębnić cały obiekt blob i utworzyć użyteczny. klucz publiczny pem.jak przekonwertować surowy moduł i wykładnik na klucz publiczny RSA (format .pem)

Obecnie rozpakowuję pełne 260 bajtów (4 bajty dla wykładnika, 256 bajtów dla modułu) i kodowanie jako base64. Robię to za pomocą następującego polecenia powłoki:

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

To daje mi następujący ciąg:

<<<<<< 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= 

Teraz, kiedy biorę parę kluczy key.pem że moduł & wykładnik pierwotnie były wyodrębnione z i wyświetlić część publicznego podobnie jak

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

uzyskać ten ciąg (i pominięto nagłówku & linie stopki:

<<<<<<<<< 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 

Można zobaczyć, że kluczem dane które zostały wyodrębnione i base64 zakodowany sam jest faktycznie obecne w danych z obowiązującymi kluczowych danych publicznych wydobytych z key.pem przy użyciu OpenSSL. Jednakże istnieją 45 znaków na początku, że moja własna ekstrakcji danych nie posiada -

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 

a ostatnie 8 znaków różnią.

ZwIDAQAB 

Czy ktoś może doradzić, jak przekonwertować moduł i wykładnik na użyteczny klucz publiczny?

(celem jest, aby zrobić to w skrypcie bash, python lub C nie widziałem jak wielu sugeruje.)

Odpowiedz

9

poleceń, które użyłeś, openssl rsa -in key.pem -pubout -out pubkey.pem, produkuje struktury ASN.1 tak:

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 

(Możesz zobaczyć strukturę za pomocą openssl asn1parse -in pubkey.pem lub używając online ASN.1 decoder).

jej zawartości:

  1. stałą nagłówka (zawiera wszystkich bajtów, określającą kodowanie całej sekwencji plus kodowanie modułu)
  2. moduł
  3. nagłówka, określając kodowanie wykładnika
  4. wykładnik

Jeśli masz moduł i wykładnik bajtów c poprawnie zebrane, możesz skonstruować klucz publiczny w formie zrozumiałej dla OpenSSL, łącząc te cztery rzeczy. Masz już pierwszy dłuższy nagłówek.W "środkowy nagłówek" to '02 03' :

  1. '02' na całkowitą
  2. długość samej liczby całkowitej wynosi 3 bajty (65537 = 01 00 01)

Jeśli moduł wynosi 2048 bajtów i wykładnik 3 bajty (tak, że pola długość pozostają ważne), plik PEM może być wytwarzany przez łączenie tych czterech:

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

Dlatego ostatnie bajty z wysypiska binarnym różnią się od outpu OpenSSL t: wyodrębnione 260 bajtów nie zawiera 02 03, ale zamiast tego rejestruje 65537 jako 00 01 00 01 (nie 01 00 01 jak w kodowaniu ASN.1).

Podsumowując, można tworzyć plik PEM takiego: (! Zauważyć bajt przesunięcia pominąć zerem bajt 65537)

Konwersja wyodrębniony moduł + wykładnik powrotem z base64 i wyodrębnić je :

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 

Tworzenie nagłówków:

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

Łączy je ze sobą:

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

Konwersja do PEM:

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

test, który można dostać roboczą klucz - sprawdzając go z dekoderem ASN.1 lub przez

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

wspaniała odpowiedź! –