Bei uns an der Schule sollen wir als Schüler fast alles neu erfinden, was es schon in Java gibt. Es soll dazu dienen, dass wir Java lernen. So sollen wir auch das Kryptologie-Verfahren von RSA selbst schreiben.
Vorgegeben wurde uns: http://de.wikipedia.org/wiki/RSA-Kryptosystem
ich hab mich daran mal versucht, hab aber das Problem, dass sich mein Programm beim dekodieren manchmal aufhängt.
Was ich vielleicht noch sagen sollte: Je größer die zu kodierende Zahl ist, um so größer muss auch das Primzahlprodukt sein (ist mir nur so aufgefallen).
Irgendwas scheint bei Schritt 6 falsch zu sein.
Machnmal klappt es, machmal streikt er aber auch und hängt sich in Schritt 6 auf, weil er keinen ganzzahligen privaten Exponenten findet.
Ich wäre euch dankbar, wenn ihr mir sagen könntet was alles falsch ist und wo man Sachen verbessern könnte.
Vorgegeben wurde uns: http://de.wikipedia.org/wiki/RSA-Kryptosystem
ich hab mich daran mal versucht, hab aber das Problem, dass sich mein Programm beim dekodieren manchmal aufhängt.
Code:
import java.math.*;
import java.util.*;
public class rsa {
static int prim=0;
public static void main(String[] args) {
//Schritt 1: Eine Zahl eingeben, die codiert werden soll:
BigInteger code = new BigInteger("9999");
//Schritt 2: Das Programm ermittelt zwei Zufallszahlen:
int p=0;
int q=0;
while(q==0){ //Solange ausführen, bis beide Vaiablen mit einer Zahl belegt sind
Primzahlen(1000); //1000=Primzahl darf nicht größer als 1000 sein
if(!(prim==0) && !(prim==p)){
if(p==0){
p=prim;
}else{
q=prim;
}
}
}
//Schritt 3: Das Primzahlprodukt (N) bilden :
int N=p*q;
//Schritt 4: Wert der Eulerfunktion berechnen:
int n=(p-1)*(q-1);
//Schritt 5: Den öffentlichen Exponenten ermitteln (nötig zum codieren):
int e=(p*q)-n;
//Schritt 6: Den privaten Exponenten ermitteln (nötig zum decodieren ):
int d=0;
for(;true;d++){
if(((e*d)%n==1)){
break;
}
}
System.out.println("Oeffentliche Keys:");
System.out.println("N="+N);
System.out.println("e="+e+"\n");
System.out.println("Private Keys:");
System.out.println("N="+N);
System.out.println("d="+d+"\n");
System.out.println("Die zu kodierende Zahl: "+code);
System.out.println("kodiert: "+kryp(code,""+N,e));
System.out.println("dekodiert: "+dekryp(kryp(code,""+N,e),""+N,d));
}
//Schritt 2... Primzahlengeneration
public static void Primzahlen(int bereich){
Random rand = new Random();
for(int i=10;i<=bereich; i++){
int tmp=0;
for(int j=2; j<10; j++){
if(i%j==0 && !(i==j)){
tmp++;
}
}
if(tmp==0){
//Ziehe eine Primzahl aus allen möglichen Zahlen aus dem Wertebereich
if((1 + Math.abs(rand.nextInt()) % 500)>480){
prim=i;
//Wenn eine Zahl gezogen wurde, beende die Primzahlermittlung
i=bereich;
}
}
}
}
public static BigInteger kryp(BigInteger zahl, String zahl2, int exp){
//Lösungsidee nach de.wikipedia.org/wiki/rsa-Kryptosystem
//Cn = Kn^e mod N für n=1,2,3(,...)
//C1 = 230911^1721 mod 263713
//C1 = 001715
BigInteger modulo = new BigInteger(zahl2);
BigInteger temp;
BigInteger lsg;
temp = zahl.pow(exp); //Exponentialrechnung
lsg = temp.remainder(modulo); //Rest Ermittel
return lsg;
}
public static BigInteger dekryp(BigInteger zahl, String zahl2, int exp){
//Lösungsidee nach de.wikipedia.org/wiki/rsa-Kryptosystem
//Kn = Cn^d mod N für n=1,2,3(,...)
//K1 = 001715^1373 mod 263713
//K1 = 230911
BigInteger modulo = new BigInteger(zahl2);
BigInteger temp;
BigInteger lsg;
temp = zahl.pow(exp); //Exponentialrechnung
lsg = temp.remainder(modulo); //Rest Ermittel
return lsg;
}
}
Was ich vielleicht noch sagen sollte: Je größer die zu kodierende Zahl ist, um so größer muss auch das Primzahlprodukt sein (ist mir nur so aufgefallen).
Irgendwas scheint bei Schritt 6 falsch zu sein.
Machnmal klappt es, machmal streikt er aber auch und hängt sich in Schritt 6 auf, weil er keinen ganzzahligen privaten Exponenten findet.
Ich wäre euch dankbar, wenn ihr mir sagen könntet was alles falsch ist und wo man Sachen verbessern könnte.