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: -)
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.
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.
Tags und Links .net c# cryptography rsa