2014-12-19 13 views
5

Ho il modulo & esponente di una chiave pubblica RSA incorporata in un file binario e sto cercando di estrarre l'intero blob e creare un file utilizzabile. chiave pubblica pem.come convertire modulo ed esponente grezzo in chiave pubblica RSA (formato .pem)

Attualmente sto estraendo i 260 byte completi (4 byte per l'esponente, 256 byte per il modulo) e la codifica come base64. Sto facendo che utilizzando il seguente comando shell:

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

Questo mi dà la seguente stringa:

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

Ora, quando prendo la coppia di chiavi key.pem che l'esponente modulo & erano originariamente estratto da , e visualizza la parte pubblica questo modo

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

ottengo questa stringa (ho omesso le linee piè intestazione &:

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

Si può vedere che i dati chiave che ho estratto e codifica Base64 me è effettivamente presente nei dati dei dati chiave pubblica valida estratte dal key.pem utilizzando OpenSSL. Tuttavia ci sono 45 caratteri all'inizio, che la mia dati estratti non ha -

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 

e gli ultimi 8 caratteri anche differire.

Qualcuno può offrire qualche consiglio su come convertire un modulo e un esponente in una chiave pubblica utilizzabile?

(l'obiettivo è di fare questo in uno script bash, non pitone o C come ho visto molti suggeriscono.)

risposta

9

Comando quale ti sei, openssl rsa -in key.pem -pubout -out pubkey.pem, produce la struttura ASN.1 come questa:

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 

(È possibile visualizzare la struttura con openssl asn1parse -in pubkey.pem o utilizzando un online ASN.1 decoder).

contenuti

It:

  1. un'intestazione fissa (contiene tutti i byte, specificando la codifica dell'intera sequenza più la codifica del modulo)
  2. modulo
  3. intestazione, specificando codifica dell'esponente
  4. esponente

Se avete il modulo ed esponente byte c raccolti in modo razionale, è possibile costruire la chiave pubblica in forma comprensibile da OpenSSL, concatenando queste quattro cose. Hai già la prima intestazione più lunga.Il "colpo di testa di mezzo" è '02 03' :

  1. '02' per l'intero
  2. la lunghezza del numero intero in sé è di 3 byte (65537 = 01 00 01)

Se il modulo è 2048 byte e esponente di 3 byte (in modo che i campi di lunghezza restano valide), il file PEM può essere prodotto da concatenare questi quattro:

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

Questo è il motivo per cui gli ultimi byte dal dump binario differiscono dal outpu OpenSSL t: i 260 byte estratti non contengono 02 03, ma invece registrano 65537 come 00 01 00 01 (non 01 00 01 come nella codifica ASN.1).

In sintesi, si può produrre il file PEM in questo modo: (! Notare l'offset per saltare lo zero byte 65537 byte)

Convertire il vostro modulo estratto + esponente di ritorno da Base64 ed estrarli :

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 

Creare le intestazioni:

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

concatenare insieme:

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

Convertire a PEM:

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

test che si ottiene il lavoro chiave - controllando con decoder ASN.1, oppure

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

risposta formidabile! –

Problemi correlati