|
You last visited: Today at 12:32
Advertisement
[Java] RSA Implementierung
Discussion on [Java] RSA Implementierung within the Java forum part of the Coders Den category.
04/04/2014, 23:36
|
#1
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
[Java] RSA Implementierung
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:
Code:
public class Bezout
{
int a = 0;
int b = 0;
public Bezout(int a, int b)
{
this.a = a;
this.b = b;
}
private int ggT(int a, int b)
{
if (a == 0) return b;
else if (b == 0) return a;
else
{
int remainder = 0;
do
{
remainder = a % b;
a = b;
b = remainder;
} while (remainder != 0);
}
return a;
}
public int getD()
{
if (a == 0) return 0;
else if (b == 0) return 1;
else
{
int s1 = 1, s2 = 0, s = 0;
int t1 = 0, t2 = 1, t = 1;
while (a % b != 0)
{
int q = a / b;
int r = a % b;
s = s1 - q * s2;
t = t1 - q * t2;
s1 = s2; s2 = s;
t1 = t2; t2 = t;
a = b;
b = r;
}
return s;
}
}
}
PublicKey & PrivateKey:
Code:
public class PublicKey
{
public int n;
public int e;
}
public class PrivateKey
{
public int n;
public int e;
public int p;
public int q;
public int d;
public int phi;
}
RSA.java:
Code:
public class RSA {
private PublicKey pk = new PublicKey();
private PrivateKey sk = new PrivateKey();
public RSA()
{
generate();
}
public List<Integer> encrypt(String m)
{
List<Integer> c = new ArrayList<Integer>();
for (char ch : m.toCharArray())
{
BigInteger i = BigInteger.valueOf(ch);
i = i.modPow(BigInteger.valueOf(pk.e), BigInteger.valueOf(pk.n));
c.add(i.intValue());
}
return c;
}
public String decrypt(List<Integer> c)
{
StringBuilder m = new StringBuilder();
for (int ch : c)
{
BigInteger i = BigInteger.valueOf(ch);
i = i.modPow(BigInteger.valueOf(sk.d), BigInteger.valueOf(sk.n));
m.append((char)i.intValue());
}
return m.toString();
}
private void generate()
{
SecureRandom sr = new SecureRandom(String.valueOf(new Date().getTime()).getBytes());
int random_1 = Math.abs(BigInteger.valueOf(Math.abs(sr.nextInt()) % 0x7FFF).nextProbablePrime().intValue());
int random_2 = Math.abs(BigInteger.valueOf(Math.abs(sr.nextInt()) % 0x7FFF).nextProbablePrime().intValue());
int random_3 = Math.abs(BigInteger.valueOf(Math.abs(sr.nextInt()) % 0x7FFF).nextProbablePrime().intValue());
while (random_3 == random_1 || random_3 == random_2)
{
random_3 = Math.abs(BigInteger.valueOf(Math.abs(sr.nextInt()) % 0x7FFF).nextProbablePrime().intValue());
}
sk.p = random_1;
sk.q = random_2;
sk.n = sk.p * sk.q;
pk.n = sk.n;
sk.phi = (sk.p - 1) * (sk.q - 1);
sk.e = random_3;
pk.e = sk.e;
sk.d = new Bezout(sk.e, sk.phi).getD();
}
}
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
|
#2
|
elite*gold: 0
Join Date: Mar 2013
Posts: 2,449
Received Thanks: 6,446
|
Nice one.
MfG
|
|
|
04/09/2014, 12:51
|
#3
|
elite*gold: 681
Join Date: Aug 2010
Posts: 521
Received Thanks: 106
|
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
|
|
|
04/09/2014, 13:10
|
#4
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
Das Buch, das ich verwende, ist übrigens dieses hier:
|
|
|
04/09/2014, 17:50
|
#5
|
elite*gold: 681
Join Date: Aug 2010
Posts: 521
Received Thanks: 106
|
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 ^^
|
|
|
 |
Similar Threads
|
CenWR - C++ HotKey Base + HWID System Implementierung
01/17/2015 - WarRock Hacks, Bots, Cheats & Exploits - 11 Replies
CenWR - C++ HotKey Base
Ich hatte heute vor, eine kleine HotKey Base zu schreiben.
Sie ist leicht erweiterbar.
Es müssen nur die Adressen angepasst werden.
Für jemanden, der C++ halbwegs beherrscht, sollte es kein Problem geben.
Außerdem wird das HWID System von Elitepvpers verwendet.
(Mehr hier).
Download
|
[D2NT 3.0] Goldbarb/Find Item Implementierung Testversion
03/05/2011 - Diablo 2 Programming - 22 Replies
Anmerkung: Ich werde hier keine Aktualisierungen mehr einfügen, da mir der Aufwand einzelne Scripts zu isolieren zu hoch ist. Die hier hochgeladene Version ist nicht mehr aktuell, eine aktuelle Version findet sich in meinem Komplettpaket.
Hallo zusammen,
nach meinem Patzer beim Itemlog bin ich euch was schuldig glaube ich. :(
Darum gibts hier nun meine Find Item Implementierung.
Ist in meinen Augen definitiv noch nicht perfekt, auch wenn sie sogesehen ziemlich rund läuft und...
|
Metin2Bay Ideen für Pserver implementierung
10/15/2009 - Metin2 PServer Guides & Strategies - 12 Replies
Hallo,
Da eig. fast alle NPCs Quests sind dachte ich mir man könnte doch einfach mal die Idee aufschnappen die sie bei Metin2.de hatten und sie als Quest umsetzen.
Da die Quests auch Datenbank Operationen durchführen ist es möglich allerdings könnte die Umsetzung ein Problem werden da ich es machen könnte aber keine Ahnung habe wie das Später aussehn soll.
Umsetzung wie ich es machen würde(Simple umsetzung):
Meine Vorstellung war jetzt das man auf den Marktplatz geht einen NPC anklickt...
|
[Suche] Script mit OCR-Implementierung
08/29/2007 - General Coding - 8 Replies
guten Tag Coder-Community,
ich suche nun seit geraumer Zeit eine Möglichkeit eine Bilddatei im Format 20x15px per OCR auszulesen und auszuwerten. Hierbei handelt es sich lediglich um eine Bilddatei ohne weitere Störungen mit einer einheitlichen Hintergrundfarbe und einer bestimmten Zahl von 5-80.
Nun bräuchte ich jedoch eine Möglichkeit, am besten in PHP diese Bilddatei einzulesen und die Zahl dahinter rauszubekommen.
Gibt es ein Web-Script, der dies erledigt? Wenn es wirklich von nöten...
|
All times are GMT +1. The time now is 12:32.
|
|