2014-12-19 26 views
5

Bir ikili dosyaya gömülü bir RSA ortak anahtarının & modülünün modülünü kullanıyorum ve blobun tamamını çıkarmaya ve kullanılabilir bir şekilde oluşturmaya çalışıyorum. pem açık anahtar.RSA ortak anahtarına ham modül ve üssün dönüştürülmesi (.pem biçimi)

Şu anda, tam 260 bayt (üs için 4 bayt, modül için 256 bayt) ayıklamak ve base64 olarak kodlamak. Ben modülü & üs aslen çıkarıldı olduğunu key.pem keypair alırken, Şimdi

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

:

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

Bu bana şu dizeyi verir: Aşağıdaki kabuk komutunu kullanarak o yapıyorum ve bu dizeyi almak yüzden

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

gibi kamu bölümünü görüntülemek (Ben başlık & altbilgi satırlarını atladık:

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

olduğunu görebilirsiniz ben çıkarıldı ve kendimi OpenSSL'yi key.pem çıkarılan geçerli genel anahtar verilerin verilerde aslında mevcut olan base64 ile kodlanmış olan anahtar verileri.

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 

ve son 8 karakterler de farklılık - Ancak kendi çıkarılan veriler yok, başında 45 karakter vardır.

ZwIDAQAB 

Bir modül ve üslerin kullanılabilir bir genel anahtara nasıl dönüştürüleceği konusunda herhangi bir tavsiyede bulunabilir mi?

(hedef, bir bash komut bunu birçok önermek gördüğümüz gibi python veya C getirmemektir.) Eğer openssl rsa -in key.pem -pubout -out pubkey.pem kullanılan

cevap

9

Komuta, böyle ASN.1 yapıdır üretir:

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 

(Sen openssl asn1parse -in pubkey.pem ile yapısını görmek veya bir online ASN.1 decoder kullanarak yapabilirsiniz).

Bu içeriği:

  1. sabit bir başlık üs kodlama belirten
  2. modülü
  3. başlık ( bütün sekans kodlama artı modülü kodlama belirten tüm bayt içerir)
  4. üs

Eğer modülüne varsa ve üs bayt c Düzgün toplanan bu dört şeyi birleştirerek, açık anahtarı OpenSSL tarafından anlaşılabilir formda oluşturabilirsin. Zaten ilk uzun başlığa sahipsin.:

  1. ' "orta başlık" '02 03' olan tamsayı için 02'
  2. tamsayı kendisinin
  3. uzunluğu 3 byte (65537 = 01 00 01)

sizin modül halinde olan (uzunluk alanları geçerli kalmasını, böylece), PEM dosyası birleştirerek üretilebilir 2048 bayt ve üs 3 bayt bu dört: ikili dökümü son bayt OpenSSL Outpu farklıdır ve neden

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

t: çıkarılan 260 bayt, 02 03 içermez, bunun yerine 65537 değerini 00 01 00 01 olarak kaydeder (ASN.1 kodlamasında olduğu gibi 01 00 01 değil).

böyle PEM dosyası üretebilir Özetlemek gerekirse: (! 65537 lider sıfır bayt atlamak için ofset bayt edin) çıkarılan modülüne dönüştürün + base64 geri üs ve bunları ayıklamak

:

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 

başlıkları oluşturun:

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

onları bir arada Concatenate:

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

PEM dönüştürme: Eğer anahtar çalışır hale

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

Testi - ASN.1 dekoderi ile kontrol ederek, ya tarafından

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

müthiş cevabı! –