Warum ist RSAParameters Modul nicht gleich Produkt von P und Q?

8

Die Werte von P und Q stimmen nicht mit dem Wert des Moduls der .Net RSAP-Parameter überein. Laut RSA-Algorithmus und MSDN-Dokumentation sollte es sein: P * Q = Modul

Ich habe ein 512-Bit-RSA-Schlüsselpaar generiert und es in XML exportiert, indem ich Folgendes aufgerufen habe:

%Vor%

Dies gab mir das folgende XML:

%Vor%

Nun habe ich erfolgreich ein kleines Testprogramm geschrieben, um Daten zu verschlüsseln, zu entschlüsseln, zu signieren und zu verifizieren.

Am Ende habe ich einen kleinen Testcode hinzugefügt:

%Vor%

Was uns die folgende Ausgabe gab:

%Vor%

Warum ist die Multiplikation von P und Q nicht gleich dem Modul?

Ich habe bereits viele Dinge wie Endian, Encoding, BigInteger-Klasse, erfolgreich verschlüsselt, entschlüsselt, signiert, mit den oben genannten XML-Schlüsseln überprüft, kann aber keine Erklärung finden, warum P und Q multipliziert nicht den Modulus ...

Kann mir jemand erklären, warum P * Q nicht der Modul ist?

Alle Werte im lesbaren Format:

%Vor%

AKTUALISIEREN :

Entsprechend der Antwort habe ich eine kleine Erweiterungsmethode für die .Net BigInteger-Klasse geschrieben, um korrekt mit den RSAParametern zu arbeiten:

%Vor%

Anwendungsbeispiel:

%Vor%

Hoffe das hilft anderen mit dem gleichen Problem: -)

    
ChrisNbg 28.12.2012, 17:51
quelle

2 Antworten

8

Hier ist mein Parsing der von Ihnen bereitgestellten XML-Parameter:

%Vor%

Wie Sie verifizieren können, ist N tatsächlich gleich P * Q.

Sie können den BigInteger (byte []) -Konstruktor nicht so benutzen, wie Sie sind, weil er erwartet, dass das Byte-Array in little-endian ist, und weil Microsoft Dinge bass ackwards gemacht hat. Vertauschen Sie stattdessen die Reihenfolge der Bytes. Und schließlich, weil die Bytes-Arrays Zweierkomplement sein sollen und Ihre Zahlen garantiert positiv sind, müssen Sie ein Null-Byte zum höherwertigen Byte des Arrays hinzufügen falls das höherwertige Byte andernfalls größer als oder gleich 128 sein.

    
James K Polk 28.12.2012, 18:07
quelle
3

BigInteger analysiert Arrays als signierte Little-Endian-Werte. RSAParameters verwendet unsigned big-endian.

So i = new BigInteger(bytes.Reverse().Concat(new byte[]{0}).ToArray())) sollte funktionieren.

    
CodesInChaos 28.12.2012 18:12
quelle

Tags und Links