2011-05-12 6 views
10

Pourquoi le module est-il complété avec des zéros non significatifs? Je lisais PKCS # 1 et PKCS # 8 mais je n'y ai rien trouvé. En C#, les zéros en tête doivent être supprimés, est-ce que quelqu'un sait pourquoi?Clé privée au format ASN.1 DER

A http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html, vous pouvez voir que le module et l'exposant ont des zéros en tête. La question est de savoir pourquoi ils l'ont, je n'ai pas encore trouvé d'explication.

Répondre

18

Les valeurs de clé privée sont codées en tant qu'INTEGER ASN.1, qui sont des valeurs signées au format complément à deux. L'octet de début nul est nécessaire lorsque la valeur MSB de la valeur de la clé RSA (non signée) est définie. Avoir l'ensemble MSB sans un octet de début nul signifierait une valeur négative. Les spécifications ASN.1 sont libres et sont liées par Wikipedia. La section pertinente est ici dans X.690, "8.3 Encodage d'une valeur entière".

Je vais donner un exemple ici dans le cas où la page liée disparaît.

Si vous avez OpenSSL, vous pouvez générer des clés de test avec:

openssl genrsa -out test.pem 512 
openssl rsa -in test.pem -out test.der -outform der 

Voici des exemples de données de test.der:

30 82 01 3b
ASN.1 SEQUENCE, 0x13b longueur, contenu suit

02 01 00
version: ASN.1 ENTIER, longueur enregistrée 1, valeur 0

02 41 00 c0 8e ... (65 octets de données)
module: ASN.1 INTEGER, longueur 65 stockée, la valeur 0xc08e ... (un zéro octet nécessaire parce que le module est> 2^511)

02 03 01 00 01
exposant public: 0x10001 (zéro octet de tête pas nécessaire parce que l'exposant est < 2^23)

02 41 00 b5 87 ... (65 octets de données)
exposant privé: 0xb587 ...

02 21 00 e7 18 ... (33 octets de données)
prime1: 0xe718 ...

02 21 00 d5 43 ... (33 octets de données)
PRIME2: 0xd543 ...

02 20 75 67 a1 ... (32 octets de données)
exponent1: 0x7567 ... (un zéro octet pas nécessaire parce que l'exposant est < 2^255)

02 20 0a f6 3f ... (32 octets de données)
exponent2: 0x0af6 ...

02 21 00 c7 13 ... (33 octets de données)
coefficient: 0xc713 ...

+0

Votre réponse est très bien expliqué. L'utilisation d'openssl pour démontrer l'explication a été utile. –

+0

note que des échantillons entiers DER ASN.1 peuvent être générés avec openssl, par ex.: 'x = 128; openssl asn1parse -genstr "INTEGER: $ x" -noout -out données && hexdump -C data' – mykhal

Questions connexes