ASN.1 Chiave privata formattata DER
Domanda
Perché il modulo è riempito con zeri iniziali?Stavo leggendo PKCS#1 e PKCS#8 ma non ho trovato nulla a riguardo.In C# gli zeri iniziali devono essere rimossi, qualcuno sa perché?
A http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html, puoi vedere che il modulo e l'esponente hanno zeri iniziali.La domanda è: perché ce l'hanno, non ho ancora trovato una spiegazione da nessuna parte.
Soluzione
I valori della chiave privata sono codificati come ASN.1 INTEGER, ovvero valori con segno nel formato del complemento a due.Il byte zero iniziale è necessario quando è impostato l'MSB del valore della chiave RSA (senza segno).Avere l'MSB impostato senza un byte zero iniziale significherebbe un valore negativo.
Le specifiche ASN.1 sono gratuite e sono collegate da Wikipedia.La sezione rilevante qui è in X.690, "8.3 Codifica di un valore intero".
Fornirò qui un esempio nel caso in cui la pagina collegata scompaia.
Se hai openssl, puoi generare chiavi di prova con:
openssl genrsa -out test.pem 512
openssl rsa -in test.pem -out test.der -outform der
Ecco i dati di esempio da test.der:
30 82 01 3b
SEQUENZA ASN.1, lunghezza 0x13b, segue il contenuto
02 01 00
versione:ASN.1 INTEGER, lunghezza memorizzata 1, valore 0
02 41 00 c0 8e ...
(65 byte di dati)
modulo:ASN.1 INTEGER, lunghezza memorizzata 65, valore 0xc08e...(è richiesto il byte zero iniziale perché il modulo è > 2^511)
02 03 01 00 01
esponente pubblico:0x10001 (byte zero iniziale non richiesto perché l'esponente è < 2^23)
02 41 00 b5 87 ...
(65 byte di dati)
esponente privato:0xb587...
02 21 00 e7 18 ...
(33 byte di dati)
primo1:0xe718...
02 21 00 d5 43 ...
(33 byte di dati)
primo2:0xd543...
02 20 75 67 a1 ...
(32 byte di dati)
esponente1:0x7567...(il byte zero iniziale non è richiesto perché l'esponente è < 2^255)
02 20 0a f6 3f ...
(32 byte di dati)
esponente2:0x0af6...
02 21 00 c7 13 ...
(33 byte di dati)
coefficiente:0xc713...