[Java] RSA Implementierung

04/04/2014 23:36 snow#1
Guten Abend,

ich mache momentan ein wenig auf dem Gebiet der Kryptographie und habe zusammen mit einem Freund mal den RSA Algorithmus implementiert. Das ganze ist relativ schlampig geschrieben und für eine richtige Verwendung muss natürlich noch einiges angepasst werden.

Bezout.java:


PublicKey & PrivateKey:


RSA.java:


Verwendung:

Code:
RSA r = new RSA();
List<Integer> e = r.encrypt("Hallo, das ist ein Test!");
String d = r.decrypt(e);
System.out.println(e);
System.out.println(d);
Output:

Quote:
[7484230, 25519014, 16496664, 16496664, 4431689, 30090520, 18294078, 24305863, 25519014, 19679855, 18294078, 23172419, 19679855, 19597773, 18294078, 17379383, 23172419, 25257367, 18294078, 19783768, 17379383, 19679855, 19597773, 1102907]
Hallo, das ist ein Test!
Formal sieht das ganze so aus:

encrypt: m x eKey -> c
decrypt: c x dKey -> m

Evtl. lernt jemand ja was dadurch. :)
04/05/2014 23:57 Lord iRemix#2
Nice one.

MfG
04/09/2014 12:51 BigJk#3
Moin, hab da noch ein paar kleine Anmerkungen ^^ Ich weiß nicht wie weit du in dem Thema bist, daher kann es sein das ich dir jez nur Sachen sage die du eh schon weißt.

1.

Warum hast du in deiner PrivateKey Klasse noch Phi, p, q. Diese werden doch nur während der Key Generation gebraucht.


2.

Ich würde dir empfehlen die Nachrichten beim Ent- und Verschlüsseln in Blöcke zu teilen, so werden die Nachrichten kleiner.

Du kannst ja Zahlen bis zu der Größe von n verschlüsseln, also kannste ja sowas machen:

Angenommen n = 110

Du willst z.B. 'ABCDE' verschlüsseln. Wir gehen dabei mal davon aus das A die Zahl 1 repräsentiert usw. und das wir nur Buchstaben im Alphabet verschlüsseln und ohne Groß- und Kleinschreibung.

Somit haben wir dieses Alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' und unsere höchste Zahl wäre die 26 ( 26 = Z )

In n passt die 26 mind. 4 mal rein. Somit können wir bis zu 4 Zeichen in einem verschlüsseln.

Also teilen wir 'ABCDE' in 'ABCD' und 'E' wandeln dies in eine Zahl um:

'01020304' und '05'

Diese Blöcke verschlüsselt man nun.


3.

Quote:
encrypt: m x eKey -> c
decrypt: c x dKey -> m
Das stimmt so nicht.

Encrypt: m ^ e % n = c
Decrypt: c ^ d % n = m

( '^' steht hier für das Potenzieren )

Im Programm selber machst du es aber wieder richtig indem, da du ModPow benutzt...

4.

Was soll Bezout heißen und warum hast du da ne Funktion drinnen zum ggT ermitteln und benutzt sie nit?


So, ich denke das wars, falls ich mich selber irgendwo vertan habe oder du noch Fragen hast werde ich diese gerne beantworten :D
04/09/2014 13:10 snow#4
Heyho,

1) korrekt, die werden nur zur Generierung gebraucht, ich wollte es nur in der Klasse haben, da das ganze ja das veranschaulichen sollte, was ich in der Theorie gelernt habe - private Eigenschaften und öffentlich bekannte Eigenschaften. Kann man in einer "richtigen" Implementierung eigentlich auch vernachlässigen, korrekt.

2) danke für den Tipp :)

3) Das ganze sollte eigentlich eher den Ablauf der Funktion an sich darstellen, encrypt wendet die Parameter m und eKey auf sich an und resultiert in c, bei decrypt dann c und dKey, das in m resultiert. Hatte noch überlegt, ob ich die eigentliche Funktion definiere, da wäre dann m ^ e % n = c natürlich richtig.

4) Das ganze ist das Lemma von Bézout (Lemma von Bézout ? Wikipedia), so erhalte ich den privaten Key für die Entschlüsselung. Die ggT Funktion wird eigentlich gar nicht benötigt, ich hatte davor eine andere Klasse geschrieben, daraus ist dann die Bézout Klasse entstanden. Einfach ignorieren. :D

Das Buch, das ich verwende, ist übrigens dieses hier: [Only registered and activated users can see links. Click Here To Register...]
04/09/2014 17:50 BigJk#5
1. Ok :)

2. Jo kein ding ^^

3. Ist halt nur nicht klar ersichtlich das du das meinst und ich denke jemand der keine Ahnung davon hat erkennt das noch weniger.

4. Aso, hatte nicht dran gedacht das das damit zusammen hängen könnte xD Hab selber bisher zum Modularen Inverse bestimmen immer den Erweiterten Euklidischen Algorithmus genutzt, hatte mich dahingehend nicht mit anderen Algorithmen beschäftigt ^^