Archiv verlassen und diese Seite im Standarddesign anzeigen : RSA
Ich habe da kürzlich einen sehr spannenden Text über diesen sehr berühmten Algorythmus gelesen. Das meiste war mit klar, aber ich habe hier 2 Fragen:
p und q sind Primzahlen: alles klar
n = p*q: Auch noch alles klar
Phi = (p-1)*(q-1) : immer noch alles klar
e ist zwischen 2 und Phi : immer noch klar
d = e^-1 mod (Phi) : hier ist das problem:
e^-1 ist ja das selbe wie 1 / e, oder. Wie kann ich einen solche zahl mod einer anderen rechnen, und das gibt dann noch eine Ganz-Zahl, kann mir das bitte jemand erklären?
c ist das kryptogramm und m ist die zu verschlüsselnde Zahl:
c = m^e mod n
und m = c^d mod n
: Wieso geht diese Rechnung auf, das kappier ich wirklich nicht!
kann mir jemand einen oder beide Frage(n) beantworten?
Hi MDK
Puh Was für Fragen. Na ich versuch das mal aus dem Gedächtniss zu beantworten.
1:
e^-1 ist leider nicht 1/e (dacht ich zum Anfang auch). Dabei handelt es sich um den Kehrwert modulo. Das ganze ist ziemlich schwer zu berechnen. Es gibt einen Algorithmus, der das ganze mehr oder weniger schnell berechnet (oder besser gesagt ausprobiert).
Es gibt auch das Problmen, das es nicht unbedingt eine Lösung geben muß. Nur wenn e und Phi relativ Prim sind, dann klapptes (darum das ganze mit Primzahlen).
Den Algorithmus kann ich dir in C++ schreiben (in VB brauch ich ein paar Tage).
Zumindest kann ich dir ein Beispiel geben:
5^-1 mod 14 = 3
2:
Also eine Mathematische Antwort kann ich dir nicht geben (hab Mathe nicht studiert).
Auf nhieb hab ich nur ein Beispiel, und die Begründung, das der Dechiffrierschlüssel ja genau für diese Berechnung berechnet wird.
n=3337
e=79
d=1019
m=688
c = 688^79 mod 3337 = 1570
m = 1570^1019 mod 3337 = 688
und d ergibt sich aus
d=79^-1 mod 3220(aus den Primzahlen berechnet)=1019
Für genauere Erklärungen brauchen wir sicher einen Chat, sonst wird das tierisch schwer. Ich hoffe ich konnte helfen:)
SeeYa
EdN
Original erstellt von EdN:
...
Nur wenn e und Phi relativ Prim sind, dann klapptes (darum das ganze mit Primzahlen).
..
Sorry, vieleicht bin ich etwas schwer von Begriff, aber was bedeutet relativ Prim? Entweder ist doch eine Zahl eine Primzahl oder keine, aber relativ? Ich habe das schon in meiner Anweisung gelesen und habe es dort schon nicht begriffen.
Ich werde das ganze auf jeden Fall mal einmal meinem Mathe-Lehrer zeigen. Wer weiss, vieleicht gibt es mal etwas anderes als diese zwar sehr interessante aber auf die Dauer unausdrägliche Vektor-Geometrie :)
__________________
MurderDeathKill
veni, vidi, vici
Hi
(konnt gestern nicht mehr antworten wegen einem fehler im netzwerk)
Hier die Antwort:
Relativ Prim zueinander sind 2 Zahlen wenn sie als einzigsten gemeinsamen Teiler 1 haben.
Als Beispiel:
15 und 28 sind relativ Prim zueinader
15 und 27 nicht
SeeYa
EdN
Also zersteinmal:
Vielen Dank, dass Du Dir so viel Mühe gegeben hast.
Leider hat es mir fast nichts weiter gebracht. Ich habe darum noch ein paar weitere Texte gesucht und bin auf etwas mir zuerst unverständliches gestossen, was aber am Schluss mir die Auflösung meines 1. Problemes gab.
Und zwar:
Es hat bei mir 2 Gruppen Texte gegeben:
die eine Gruppe sagte:
d = e^-1 mod(phi) oder
d = e^-1 (mod (phi)
und die anderen sagten:
e*d -1 ist ganz teilbar durch phi.
Zuerst dachte ich, ich habe es mit zwei verschiedenen RSA Algorythmen zu tun, bis mir ein Licht auf ging. Die in der 1. Gruppe hatten zum Teil etwas nicht geschrieben, was aber sehr wichtig zur verständigung ist, und zwar die Klammern!!
Ich versuche das zu erklären.
Der Term:
d = e^-1 (mod (phi))
bedeutet nicht das:
d ist gleich e hoch minus eins , und das modular dividiert mit phi,
sondern:
d ist gleich e hoch minus eins, wenn man im modular-bereich von phi rechnet!!!!
Das heisst im Klartext:
d = e^-1 (mod (phi)) | *e
<=> d*e = 1 (mod (phi))
und das heisst nicht anderes als
Hi
Also laut Bruce Schneier ist e^-1 mod phi
Nicht durch eine einfache Rechnung zu erhalten, sondenr nur drch einen Algorithmus. Also kann die Aussage e^-1=1/e nicht stimmen.
Weil 1/e leicht zu berechnen wäre, bräuchte man keinen Algorithmus, der mehr oder weniger alle Möglichkeiten testet.
Als Beispiel nochmal diese Zeile:
d=79^-1 mod 3220=1019
Was viele nämlich übersehen ist,das es nicht 79^-1 UND Modulo heißt, sondern Kehrwert modulo und das ist was ganz anderes.
Rechne am besten mal das Beispiel durch, das ist aus >Angewandte Kryptographie< (also richtig).
Dann kannst du auch genau sehen wie das ganze funktioniert.
SeeYa
EdN
Exekutor
06.12.2000, 14:53
MurderDeathKill hat bis d*e mod (phi) = 1 recht.
Beim Beipiel: 79 * 1019 mod 3220 = 80501 mod 3220 = 1
Das heißt aber nicht, dass e^-1 = 1/e ist und zwar einfach aus dem Grund, dass der Kehrwert modulo nur in der Schreibweise e^-1 definiert ist. Reine Definitionssache also.
Hi Exekutor
hast recht, hab mich doch tatsächlich vertippt. :)
ola,
die korrektheit von rsa ist mathematisch gesehen in einer zeile erklärt:
Verschlüsselung: fe(m):=m^e mod n
Entschlüsselung: fd(m):=m^d mod n
Korrektheit: fd(fe(m))=(m^e)^d mod n=m
genauer ist das ganze erklärt in "moderne verfahren der kryptographie" von Beutelspacher, auf seite 19.
hawky
Exekutor
11.12.2000, 13:40
Ja schon aber hier ging es (zum Schluss) um die Berechnung und die Bedeutung von e^-1, also den Kehrwert modulo, und nicht um eine allgemeine Beschreibung von RSA.
Deine (natürlich korrekten) Formeln sagen nichts darüber aus wie e und d zu wählen sind.
stimmt, zur wahl von d und e habe ich mich nich geäußert, aber vielleicht wäre es ganz hilfreich wenn man sich dazu mal den kleinen satz von fermat ansieht (vorsicht der hat soviel ich weiß _nix_ mit dem bekannten großen satz von fermat zu tun). mit einer geeigneten langzahlarithmetik sollte das dann auch kein problem sein ...
Exekutor
12.12.2000, 14:48
Du hast recht, die mathematische Grundlage von RSA ist der kleine Satz von Fermat, der schlicht und einfach folgendes besagt:
a^(m-1) = 1 (mod m) für m prim und a kein Vielfaches von m.
Jetzt zur Wahl von e und d bei RSA:
Man wählt ein zufälliges e das relativ prim zu (p-1)(q-1) ist.
Man berechnet d mit hilfe des erweiterten Euklidischen Algorithmus.
bei praktischen implementierungen ist e oftmals 3,17 oder 65537. da in der dualdarstellung dieser zahlen nur wenige einsen auftauchen und man sie deshalb einfach als exponenten benutzen kann. wobei von der 3 abzuraten ist, da es dagegen eine sinnvolle attacke gibt.
Exekutor
13.12.2000, 13:57
Stimmt, das erspart dir aber nicht d zu berechnen.
CU
Vergesst den Begriff "relativ prim". Es ist eine falsche Übersetzung von "relative prime" und bedeutet simpel und einfach teilerfremd.
Btw, Patent ist ausgelaufen sollte das jemand noch nicht mitgekriegt haben.
Lassen wir dieses Thema und kommen wir zum Algorythmus selber zurück:
Ich wüsste eigentlich gerne, wie man d berechnet.
@EdN: Kannst Du mir mal das Progamm schicken, auf C++isch :D
__________________
MurderDeathKill
veni, vidi, vici
File Overkill
30.12.2000, 19:29
Hello,
wenn Du zu einem gegebenem e und n ein d berechnen willst, so dass gilt e*d mod n=1 (man sagt hier e*d ist kongruent zu 1 modulo n, das entsprechende d wird dann multiplikatives Inverses zu e im Restklassenring n genannt) kannst Du den euklidischen Algorithmus verwenden (ggT()). Das funktioniert so (Auszug aus "Kryptographie in C und C++"):
Multiplikatives Inverses zu a mod n:
1.Setze u=1,g=a,v1=0,v3=n
2.q=g/v3,t3=g%v3,t1=u-q*v1 mod n,u=v1,g=v3,v1=t1,v3=t3
3.v3==0?Ausgabe g->ggT(a,n),u->Inverses zu a mod n:gehe zu 2
Testen kannst Du diesen Algorithmus durch die Operation e*d mod n, was 1 ergeben sollte. Eine wichtige Voraussetzung für die Erzeugung eines multiplikativen Inversen ist übrigens die Teilerfremdheit von a und n.
Sorry, ich benutze andere Bezeichnungen als Du, kannst Du mal angeben, was was ist?
Ach ja, eine Zahlenbeispiel wäre noch nett, ich würde es wahrscheinlich auch selber schaffen, aber sicher ist sicher.
__________________
MurderDeathKill
veni, vidi, vici
File Overkill
30.12.2000, 21:20
Also n ist der Modulo (RSA benutzt hierbei die Eulersche Phi-Funktion von p*q [sogesehen (p-1)(q-1)]), a ist eine beliebige Zahl. Wie schon gesagt ist u das Inverse Multiplikative zu a, g ist der größte gemeinsame Teiler von a und n. Die restlichen Variablen sind nur für den internen Ablauf des Algorithmus bedeutend und somit nicht interessant.
So, hier noch ein kleines Zahlenbeispiel in Form der Ausgabe meiner Implementation dieses Algorithmus (16-Bit Wert). Ich habe übrigens die Operation t=u-q*v1 durch t=u+q*v1 ersetzt (das Paket kann zur Zeit nicht mit negativen Zahlen rechnen), sollte sich aber nicht im Besonderen auf den Algorithmus auswirken.
---
a:41397
n:25459
v1 = 0
v3 = 0
U = 1
g = 41397
v3 = 25459
q = 41397 / 25459 = 1
t3 = 41397 % 25459 = 15938
t1 = 1 + 1 * 0 % 25459 = 0
u = 0
g = 25459
v1 = 1
v3 = 15938
q = 25459 / 15938 = 1
t3 = 25459 % 15938 = 9521
t1 = 0 + 1 * 1 % 25459 = 1
u = 1
g = 15938
v1 = 1
v3 = 9521
q = 15938 / 9521 = 1
t3 = 15938 % 9521 = 6417
t1 = 1 + 1 * 1 % 25459 = 1
u = 1
g = 9521
v1 = 2
v3 = 6417
q = 9521 / 6417 = 1
t3 = 9521 % 6417 = 3104
t1 = 1 + 1 * 2 % 25459 = 2
u = 2
g = 6417
v1 = 3
v3 = 3104
q = 6417 / 3104 = 2
t3 = 6417 % 3104 = 209
t1 = 2 + 2 * 3 % 25459 = 6
u = 3
g = 3104
v1 = 8
v3 = 209
q = 3104 / 209 = 14
t3 = 3104 % 209 = 178
t1 = 3 + 14 * 8 % 25459 = 112
u = 8
g = 209
v1 = 115
v3 = 178
q = 209 / 178 = 1
t3 = 209 % 178 = 31
t1 = 8 + 1 * 115 % 25459 = 115
u = 115
g = 178
v1 = 123
v3 = 31
q = 178 / 31 = 5
t3 = 178 % 31 = 23
t1 = 115 + 5 * 123 % 25459 = 615
u = 123
g = 31
v1 = 730
v3 = 23
q = 31 / 23 = 1
t3 = 31 % 23 = 8
t1 = 123 + 1 * 730 % 25459 = 730
u = 730
g = 23
v1 = 853
v3 = 8
q = 23 / 8 = 2
t3 = 23 % 8 = 7
t1 = 730 + 2 * 853 % 25459 = 1706
u = 853
g = 8
v1 = 2436
v3 = 7
q = 8 / 7 = 1
t3 = 8 % 7 = 1
t1 = 853 + 1 * 2436 % 25459 = 2436
u = 2436
g = 7
v1 = 3289
v3 = 1
q = 7 / 1 = 7
t3 = 7 % 1 = 0
t1 = 2436 + 7 * 3289 % 25459 = 23023
u = 3289
g = 1
v1 = 25459
v3 = 0
3289(Inverses Multiplikatives)
---
Das ist ja alles schön und gut, aber ich verstehe leider kein Wort.
Inverse Multiplikative
Wunderbar, supper, schönes Wort, wirklich.
Und was heisst das jetzt für eine nicht Mathe Doktorierenden?
Ich verstehe etwas von Mathe, ich mache in 2 Jahren meine Matur mit schwerpunkt Mathe, aber von so etwas habe ich jetzt wirklich noch nie etwas gehört.
Könntest Du nochmals ganz langsam, schön von vorne genau erklären, was Du da machst, und nicht einfach 4 Formeln nach einander hinschreiben!
Vielen Dank
__________________
MurderDeathKill
veni, vidi, vici
File Overkill
01.01.2001, 16:14
Nun gut, hinter dem Begriff verbirgt sich nichts Aufregendes, ist im Grunde ganz simpel. Wenn Du in der Schule Schwerpunkt Mathe hast wirst Du das Rechnen in unendlichen Ringen oder Körpern schon gewohnt sein (N,Z,...). Neben diesen Systemen gibt es noch sog. "Restklassenringe" (geschrieben mit dem Formelsymbol des verwendeten Zahlensystems plus einem Wert im Index rechts unten). Diese Systeme unterscheiden sich von den normalen Rechensystemen insofern, als dass jede ausgeführte Operation modulo n reduziert wird (vergleichbar mit Überläufen von Variablen), wobei n den Modul des entsprechenden Restklassenringes darstellt. Rechnen wir beispielsweise in Z13, so liegen alle Ergebnisse unserer arithmetischen Operationen im Bereich von 0-12 (analog zur schriftlichen Division kann der Teilungsrest nie größer sein als der Divisor). In solchen Systemen ist es unter gewissen Voraussetzungen möglich mit den bereits vielfach genannten "multiplikativen Inversen" zu rechnen. Ein einfaches Beispiel: Rechnen wir in Z14 (n=14), nehmen ein a=3 und ein dazu inverses b=5, dann ergibt
4 * 3 mod 14 = 12
12 * 5 mod 14 = 4
3 * 5 mod 14 = 1
Wie man sieht ergibt die Rechnung mit einer Beispielzahl 4 die Zahl 12 (sozusagen die verschlüsselte 4), eine weitere Rechnung mit dem zu 3 inversen Multiplikativen 5 ergibt wieder 4. Eine Multiplikation von von a und b resultiert in der Zahl 1. Das ist eigentlich der ganze Zauber des RSA-Algorithmus (genauer gesagt verwendet der RSA-Algorithmus keine Multiplikationen sondern modulare Potenzierungen). Um solche inversen Multiplikativen zu erzeugen ist als wichtige Bedingung zunächst die Teilerfremdheit von a und n zu beachten (ggT(a,n)=1, hier wäre der Begriff "relativ prim" anzuwenden). Um zu einem gewählten a ein passendes b zu generieren gibt es nun verschiedene Möglichkeiten. Einmal kann man den Satz von Fermat in Verbindung mit der Eulerschen Phi-Funktion verwenden (Phi(n) bezeichnet sämtliche zu n teilerfremden Zahlen < n ). Da gilt a^Phi(n)=1 mod n (man sagt auch a^Phi(n) ist kongruent zu 1 modulo n) lässt sich über a^(Phi(n)-1) mod n ein entsprechendes Inverses zu a finden. Ein Beispiel:
a = 3 , n = 17
Phi(n)=16
a^15 mod 17 = 6
Test:
4 * 3 mod 17 = 12
12 * 6 mod 17 = 4
---
In der Praxis ist diese Methode allerdings unüblich, da sie eine modulare Potenzierung erfordert, was viel Rechenzeit kostet. Gebräuchlicher hingegen ist der sog. "erweiterte euklidische Algorithmus". Um ihn zu verstehen sollte man zunächst die normale Variante, also den "euklidischen Algorithmus" betrachten, der dazu dient den größten gemeinsamen Teiler zweier Zahlen zu finden. Dabei gilt folgende Vorgehensweise:
ggT(a1,a2)
a1 = a2*q1 + a3 0<=a3<a2
a2 = a3*q2 + a4 0<=a4<a3
a3 = a4*q3 + a5 0<=a5<a4
...
am-1 = am*qm-1 0<=am<am-1
ggT(a1,a2)=am
---
Was hier getan wird ist solange zu dividieren bis schliesslich kein Rest mehr auftaucht (was spätestens bei der Division durch 1 der Fall ist). Zunächst rechnet man also a1/a2 und erhält so q1, dann wird a1 mod a2 gerechnet und somit a3 festgestellt. Den Quotienten aus der ersten Division (bzw. den Dividenden, falls der größer als der Quotient sein sollte) verwendet man nun in der zweiten Rechnung und dividiert mit dem oben erhaltenen Rest. So wird fortgefahren bis kein Rest mehr zurückbleibt. Ein Beispiel:
ggT(23,47):
23 = 0 * 47 + 23
47 = 2 * 23 + 1
23 = 23* 1
Wie man sieht ist der ggT von 23 und 47 = 1. Stellt man die oben geschriebenen Gleichungen nun um, so dass aus
(1)am-2 = am-1*qm-2 + a m
(2)am = am-2 - am-1 * qm-2
wird, fährt so fort wobei man weiterhin
(3)am-1 = am-3 - am-2*qm-3
erhält, so kann man in Gleichung 2 den Wert am-1 durch die rechte Seite der Gleichung 3 ersetzen, wobei sich
(4)am= am-2 - qm-2 * (am-3 - am-2*qm-3)
ergibt. Wenn sich am = 1 ergibt benutzt man die vorher gewonnenen Faktoren, die eingesetzt werden und somit eine Gleichung der Form 1 = a*u + b*v ergeben. Aus diesen Faktoren lässt sich dann das multiplikative Inverse ausrechnen. Ein Beispiel für den RSA-Algorithmus:
p=11 q=7 n=77 Phi(n)=(p-1)(q-1) <=> 60
a=13 b=?
Beginnen wir jetzt mit dem euklidischen Algorithmus zur Berechnung des ggT(13,60):
13 = 0*60 + 13
60 = 4*13 + 8
13 = 1*8 + 5
8 = 1*5 + 3
5 = 1*3 + 2
3 = 2*1 + 1
2 = 2*1
Interessant ist für uns lediglich die vorletzte Gleichung. Jetzt formen wir der Reihe nach um, so dass der Divisionsrest jeweils links steht:
1:1 = 3 - 2 * 1
2:2 = 3 - 3 * 1
3:3 = 8 - 5 * 1
4:5 =13 - 1 * 8
5:8 =60 - 4 *13
Jetzt benutzen wir jeweils die nachfolgende Gleichung und setzen zunächst 2 in 1 ein, erhalten somit 1', setzen 3 in 1' ein und fahren so fort bis wir die beiden Orginalzahlen 13 und 60 mit 2 Linear-Faktoren erhalten:
1':1=3-5+3 <=> 1 = 2*3 -5
2':1=2*8-2*5-5 <=> 1 = 2*8 - 3*5
3':1=2*8-3*13+3*8 <=> 1 = 5*8-3*13
4':1=5*60-20*13-3*13 <=> 1 = 5*60 - 23*13
Unsere letzte Gleichung hat also die Form 1 =a*u + b*v, wobei u = 5 und v = -23.
Rechnen wir nun 23 * 13 mod 60 = 59 so stellt man fest, dass 23 nicht das inverse Multiplikative sein kann. Rechnen wir also (60+(-23)) * 13 mod 60 = 1 und haben damit b = 37. Analog könnten wir Fermats Satz benutzen und b durch a^(Phi(n)-1) mod n berechnen. Da Phi(60)=48 ergibt a^47 mod 60 =37.
Jetzt wo wir ein inverses Paar a=13<>b=37 haben können wir entweder mit p * a mod Phi(n) = c , c * b mod Phi(n) = p
oder mit p^a mod n = c, c^b mod n = p rechnen. Die zweite Variante ist beim RSA-Algorithmus natürlich die einzig sinnvolle, da unter Veröffentlichung von Phi(n) leicht inverse Paare von jedem berechnet werden könnten. Ich empfehle wie gesagt das Buch "Kryptographie in C und C++", da dort viele hier verwendeten Algorithmen erklärt und eine Reihe Verweise zu weiteren Materialien genannt werden.
Hier noch eine C-Funktion die den Zweck der Findung eines solchen Inversen erfüllen sollte:
----
int ggt_inv(int a, int n)
{
int residue=0;
int g=0;
int q=0;
int t3=0;
int t1=0;
int v1=0;
int v3=0;
int u=1;
g=a;
v3=n;
START:
q=g/v3;
t3=g%v3;
t1=u-q*v1%n;
u=v1;
g=v3;
v1=t1;
v3=t3;
if (v3>0)
{
goto START;
}
return u;
}
----
[Dieser Beitrag wurde von File Overkill am 01. Januar 2001 um 17:24 editiert.]
Phoenix23
02.01.2001, 10:52
Wenn ihr euch wirklich so sehr damit auseinander setzen wollt, kauft euch doch ein Buch über RSA! Ein allgemeines Buch ist Geheime Botschaften von Simon Singh, oder schaut einfach mal
da: http://www.rsa.com/rsalabs/faq/html/questions.html
C yA
Phoenix²³
__________________
Life is a Lesson
[Dieser Beitrag wurde von Phoenix23 am 02. Januar 2001 um 11:53 editiert.]
[Dieser Beitrag wurde von Phoenix23 am 02. Januar 2001 um 11:55 editiert.]
Phoenix23
02.01.2001, 11:08
Oder schaut mal hier:
http://www.uni-essen.de/hrz/mathe/maple/worksheets/rsa.mst.html
Das sieht noch am Besten aus!
C yA
Phoenix²³
__________________
Life is a Lesson
Dieses Buch von Simon Singh habe ich auch. Sogar die engl. Version. Da heisst es "The Code Book"
Es ist ein sehr gutes Geschichts-Buch, wenn man wissen will, wie sich die Kryptographie entwickelt hat. Aber wenn man wissen will, wie etwas ganz genau funktioniert, ist es nicht zu gebrauchen, wirklich!
Und dass PGP mit einem genug hohen Schlüssel unknackbar ist, ist auch sehr zu hinterfragen. Viele Regierungen meinen nämlich, dass die NSA eine Hintertür eingebaut hat.
__________________
MurderDeathKill
veni, vidi, vici
Exekutor
02.01.2001, 14:06
PGP ist sicher, der Sourcecode ist und war schon immer offen.
Regierungen reden viel blödsinn, man darf ihnen nicht alles glauben, v.a. nicht Geheimdiensten.