Berechnen Primzahlen p und q aus private exponent (d), public exponent (e) und der modulus (n)
Wie berechne ich die p-und q-Parameter von e (publickey), d (privatekey) und E-Modul?
Ich habe BigInteger Schlüssel in der hand kann ich kopieren und einfügen in den code. Ein publickey, ein privatekey und ein E-Modul.
Brauche ich zur Berechnung der RSA-Parameter p und q ab. Aber ich vermute, es ist eine Bibliothek für das, was ich war nicht in der Lage zu finden mit google. Irgendwelche Ideen? Danke.
Diese nicht brute-force, da bin ich nicht nach dem privaten Schlüssel. Ich habe nur ein legacy-system, das speichert einen öffentlichen, einen privaten Schlüssel und ein E-Modul und die ich brauche, um Sie in c# zur Verwendung mit RSACryptoServiceProvider.
So kommt es auf die Berechnung von (p+q) von
public BigInteger _pPlusq()
{
int k = (this.getExponent() * this.getD() / this.getModulus()).IntValue();
BigInteger phiN = (this.getExponent() * this.getD() - 1) / k;
return phiN - this.getModulus() - 1;
}
aber das scheint nicht zu funktionieren. Erkennen Sie das problem?
5 Stunden später... 🙂
Ok. Wie kann ich wählen Sie eine zufällige Zahl aus Zn* (http://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) in C#?
- Bitte Wort in dieser Frage klarer zu sehen. Sie haben zwei BigInteger Schlüssel, und Sie Sie nutzen wollen, zu tun, was?
- Hmmmmm... knopfaugen auf
- Vermeiden Sie die "HILFE" - Ding, das hässliche und nicht gebraucht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns davon ausgehen, dass e ist klein (das ist der häufigste Fall; die Traditionelle öffentliche exponent 65537). Lassen Sie uns auch annehmen, dass ed = 1 mod phi(n), wo phi(n) = (p-1)(q-1) (dies ist nicht notwendigerweise der Fall; der RSA-Anforderungen sind, dass ed = 1 mod lcm(p-1,q-1) und phi(n) ist nur ein Vielfaches von lcm(p-1,q-1)).
Jetzt haben Sie ed = k*phi(n)+1 für einige ganze Zahl k. Da d ist kleiner als phi(n), wissen Sie, dass k < e. So dass Sie nur eine kleine Anzahl von k zu versuchen. Eigentlich phi(n) ist in der Nähe n (die Differenz wird auf die Reihenfolge der sqrt(n); in anderen Worten, wenn aufgeschrieben, in bits, die Obere Hälfte der phi(n) ist identisch mit n), so kann man berechnen k' mit: k'=round(T/n). k' ist sehr nah an k (d.h. |k'-k| <= 1), solange die Größe der e ist nicht mehr als die Hälfte der Größe der n.
Gegeben k, Sie leicht phi(n) = (ed-1)/k. So kommt es, dass:
phi(n) = (p-1)(q-1) = pq - (p+q) + 1 = n + 1 - (p+q)
Somit erhalten Sie p+q = n + 1 - phi(n). Sie haben auch pq. Es ist Zeit, sich zu erinnern, dass für alle reellen zahlen eine und b, eine und b sind die beiden Lösungen der quadratischen Gleichung X2-(a+b)X+ab. So, da p+q und pq, p und q sind, die durch Lösung der quadratischen Gleichung:
p = ((p+q) + sqrt((p+q)2 - 4*pq))/2
q = ((p+q) - sqrt((p+q)2 - 4*pq))/2
Im Allgemeinen Fall e und d haben können beliebige Größen (evtl. größer als n), weil alle, die RSA benötigt wird, dass ed = 1 mod (p-1) und ed = 1 mod (q-1). Es ist eine generische (und schnelle) Methode, die ein bisschen aussieht wie der Miller-Rabin primality test. Es ist beschrieben in der Handbook of Applied Cryptography (Kapitel 8, Abschnitt 8.2.2, Seite 287). Diese Methode ist konzeptionell ein bisschen komplexer (es umfasst die modularen Errichtung in die Stufe), kann aber einfacher zu implementieren (weil es keine Quadratwurzel).
Gibt es ein Verfahren zum wiederherstellen p und q von n, e und d beschrieben in NIST Special Publication 800-56B R1 Empfehlung für die Pair-Wise Key-Einrichtung Systeme unter Verwendung der Integer-Faktorisierung Kryptographie in Anhang C.
Die Schritte, die beteiligt sind:
Ich schrieb vor kurzem eine Implementierung in Java. Nicht direkt hilfreich für C#, die ich realisieren, aber vielleicht kann er einfach portiert:
Dieser code verwendet ein paar Helfer Definitionen/Methoden:
!bi.testBit(0)
Habe ich angepasst, die Java-code von Duncan in C#, falls es jemanden interessiert:
Diese nutzt die standard-System.Numerik.BigInteger-Klasse.
Getestet wurde dies durch die folgenden unit-test:
Implementiert habe ich die Methode beschrieben von Thomas Pornin.
Den BigInteger Klasse Chew Keong TAN C# - version (check-codeproject Kommentare für bug-fixes)