Perché la lunghezza della chiave openssl è diversa dai byte specificati

4

Mi rendo conto che questa è una domanda rudimentale, ma non riesco nemmeno a capirlo da Google. Perché la lunghezza della chiave openssl è diversa dai byte specificati? Ad esempio quando uso il comando:

openssl genrsa -out testKey 512

Produco una chiave nel mio file testKey con il messaggio "Generazione della chiave privata RSA, modulo lungo 512 bit". Tuttavia, quando controllo la lunghezza della sola porzione di chiave all'interno del file, è lunga solo 424 caratteri.

Perché è così, e perché non è in realtà lungo 512 caratteri?

C'è un modo per generare una chiave RSA tramite openssl con una lunghezza specifica in mente, come 512 caratteri? Mi rendo conto che il mio fraintendimento potrebbe derivare dalla mia mancanza di conoscenza di ciò che il comando precedente sta effettivamente facendo, ma ho solo bisogno di una spinta nella giusta direzione.

    
posta void.massive 12.10.2015 - 18:59
fonte

2 risposte

3

Stai generando una chiave privata RSA con un modulo 512. Tuttavia, RSA ha bisogno di alcuni elementi in più per funzionare (l'articolo di Wikipedia è abbastanza buono qui). Dato che questa non è una domanda riguardante RSA, non entrerò nei dettagli e invece ti darò il comando che stai cercando.

Per elaborare la chiave privata RSA e vedere cosa tutto è contenuto in questi dati, eseguire il seguente comando:

openssl rsa -noout -text -in testKey

Il primo blocco è il tuo modulo privato a 512 bit.

    
risposta data 12.10.2015 - 22:00
fonte
3

Le lunghezze delle chiavi per le cifre sono generalmente espresse in bit, non in byte. 8 bit = 1 byte. Quindi quello che ti aspetteresti di vedere è una chiave di 512 bit = 64 byte, quindi perché non l'hai fatto?

Primo: il formato. Il file di output del tuo comando è un file PEM, il che significa che è un Base64 -encoded DER struttura dati codificata in cui i dati Base64 sono racchiusi tra queste righe -----BEGIN … ----- e -----END … ----- . Base64 è una codifica che emette 4 caratteri per ogni 3 byte di input. Quindi i tuoi 424 caratteri dopo la codifica Base64 erano 318 byte (= 2544 bit) prima della codifica. Ma questo non è ancora 64 byte, vero?

Secondo: dati aggiuntivi. Quando richiedi una chiave con una dimensione di 512 bit, ciò che stai richiedendo è una chiave il cui modulo pubblico ha una dimensione di 512 bit. Ma una chiave RSA chiave pubblica consiste in questo modulo pubblico e esponente pubblico. Quest'ultimo di solito è piuttosto piccolo, nel tuo esempio era di 17 bit (memorizzati come 3 byte). Cos'altro?

Terzo: la chiave privata. Quindi il comando genrsa genera effettivamente una coppia di chiavi RSA composta da chiave privata e pubblica. Non esiste un comando per generare semplicemente una chiave pubblica, poiché ciò sarebbe inutile. Invece, per convenzione, quando si memorizza la chiave privata, si memorizza anche la chiave pubblica, poiché è comunque solo un valore aggiuntivo. Normalmente la chiave privata dovrebbe avere all'incirca le stesse dimensioni dell'esponente pubblico, quindi non abbiamo ancora spiegato le dimensioni del file. Questo perché openssl utilizza un ottimizzazione basata sul teorema del remainder cinese e per questo ha bisogno per memorizzare tre valori aggiuntivi con la chiave privata.

Come puoi vedere tutto questo per te?

  • openssl base64 -d -in testKey -out testKey.raw decodificherà la codifica base64 e produrrà i dati grezzi. Questo ha una dimensione di 318 byte.
  • openssl asn1parse -in testKey (o in alternativa: openssl asn1parse -in testKey.raw -inform der per indicare che non si aspetta PEM ma DER grezzo) analizzerà genericamente la codifica ASN.1 DER e mostrerà i singoli campi.
  • openssl rsa -in testKey -text -noout analizzerà il file come una chiave RSA e ti darà un'interpretazione di tutti i campi, cioè i loro valori.
risposta data 12.10.2015 - 23:46
fonte