2017-10-17 4 views
0

Die Dokumentation für libgcrypt sagt:Warum sagt gcrypt, den Koeffizienten eines RSA-Schlüssels bei der Konvertierung vom SSL-Format in gcrypt neu zu berechnen?

An RSA private key is described by this S-expression: 

(private-key 
    (rsa 
    (n n-mpi) 
    (e e-mpi) 
    (d d-mpi) 
    (p p-mpi) 
    (q q-mpi) 
    (u u-mpi))) 

... und ...

p-mpi 
    RSA secret prime p. 
q-mpi 
    RSA secret prime q with p < q. 
u-mpi 
    Multiplicative inverse u = p^{-1} mod q. 

... und ...

Note that OpenSSL uses slighly different parameters: q < p and u = q^{-1} mod p. 
To use these parameters you will need to swap the values and recompute u. 
Here is example code to do this: 

    if (gcry_mpi_cmp (p, q) > 0) 
    { 
     gcry_mpi_swap (p, q); 
     gcry_mpi_invm (u, p, q); 
    } 

Wenn in einem p die kleineren Primzahl und in der anderen q ist die kleinere Primzahl, und da die beiden Gleichungen identisch sind, außer für den Austausch von p und q, ist es wirklich notwendig, müssen Sie neu zu berechnen? Reicht es nicht, nur p und q auszutauschen?

Als Seite Frage, ich bin neugierig, warum gcrypt nicht die gleichen Werte wie die PKCS # 1-Codierung zu verwenden ist:

 RSAPrivateKey ::= SEQUENCE { 
     version   Version, 
     modulus   INTEGER, -- n 
     publicExponent INTEGER, -- e 
     privateExponent INTEGER, -- d 
     prime1   INTEGER, -- p 
     prime2   INTEGER, -- q 
     exponent1   INTEGER, -- d mod (p-1) 
     exponent2   INTEGER, -- d mod (q-1) 
     coefficient  INTEGER, -- (inverse of q) mod p 
     otherPrimeInfos OtherPrimeInfos OPTIONAL 
    } 

o modulus is the RSA modulus n. 
o publicExponent is the RSA public exponent e. 
o privateExponent is the RSA private exponent d. 
o prime1 is the prime factor p of n. 
o prime2 is the prime factor q of n. 
o exponent1 is d mod (p - 1). 
o exponent2 is d mod (q - 1). 
o coefficient is the CRT coefficient q^(-1) mod p. 
+0

Kann man das nicht einfach mit einem einfachen Experiment selbst herausfinden? –

+0

Wahr. Ich tat. Ich weiß nicht, warum die Dokumentation sagt, "du" neu zu berechnen. Ich benutzte einfach p im Sexp als Wert für q und umgekehrt und es funktioniert gut ... außer dass ich gelegentlich ein Null-Byte vor den entschlüsselten Inhalt gebe. – AlastairG

Antwort

0

Die Antwort ist, dass neu zu berechnen „u“ irrelevant ist. Tauschen Sie einfach die Verwendung von "p" und "q" aus und alles funktioniert.

Als allgemeiner Kommentar zu gcrypt sind die asymmetrischen Kryptographie-APIs schrecklich. Wirklich miserabel.

  • Es gibt keine Unterstützung für das Laden von Schlüsseln aus der Datei in beliebigem Format.

  • Es gibt keine Unterstützung einfach zu verschlüsseln und/oder einen Puffer entschlüsseln. Stattdessen müssen Sie den Puffer in einen MPI konvertieren, bevor Sie ihn in einen S-Ausdruck konvertieren können. Nach der Verschlüsselung müssen Sie den resultierenden S-Ausdruck abwickeln, um das richtige Stück zu erhalten, und dann eine weitere Funktion aufrufen, um an die Daten selbst zu gelangen. Entschlüsselung erfordert etwas mehr Komplexität beim Erstellen des S-Ausdrucks, um aus einem Puffer zu entschlüsseln, aber das Abrufen der Daten ist nur ein Funktionsaufruf.

  • Die Parameter für den S-Ausdruck für den privaten Schlüssel stimmen nicht mit den Werten im Standard-PKCS # 1-Format überein (obwohl die Konvertierung durch diese Frage und Antwort relativ einfach ist). Warum nicht?

  • Im Laufe meiner Untersuchungen habe ich entdeckt, dass es eine weitere GNU-Verschlüsselungsbibliothek gibt. Warum sie zwei beibehalten, habe ich keine Ahnung. Die andere heißt "Brennnessel" und ist viel besser:

    *) Es verwendet die GMP-Bibliothek für Ganzzahlen mit variabler Ganzzahl, anstatt einen eigenen Typ wie gcrypt (mpi_t).

    *) Es unterstützt den Laden Schlüssel von Dateien in einer Vielzahl von Formaten (ich es als Grundlage für meine eigenen Code-Schlüssel für die Verwendung mit gcrypt zu laden).

    *) Es unterstützt die Konvertierung von verschiedenen Formaten (PEM-> DER, DER-> Sexp).

    *) Es unterstützt eine Vielzahl von symmetrischen Verschlüsselungsalgorithmen und -modi.

    *) Es unterstützt asymmetrische Verschlüsselung/Entschlüsselung/Signierung/Verifikation.

    ich es eigentlich nicht verwenden, so kann ich auf der APIs Usability Kommentar nicht wirklich, aber von dem, was ich sah es in der Regel viel besser war.

    Ich weiß nicht wirklich den Hintergrund auf Brennnessel, aber ich frage mich, ob es erstellt wurde, einfach weil gcrypt API ist so schrecklich und sie würden lieber neu beginnen als gcrypt zu verbessern.

    Verwandte Themen