Hi,
also wir müssen eine RSA Klasse schreiben.
Habe soweit alles fertig, aber ist das normal, dass der nach dem Ausführen nichts anzeigt? Müsste doch true oder false anzeigen? Gibts vlt. irgendwo nen Fehler, wo eine Schleife vlt. nicht endet? Ich find den Fehler nicht.
lg
also wir müssen eine RSA Klasse schreiben.
Habe soweit alles fertig, aber ist das normal, dass der nach dem Ausführen nichts anzeigt? Müsste doch true oder false anzeigen? Gibts vlt. irgendwo nen Fehler, wo eine Schleife vlt. nicht endet? Ich find den Fehler nicht.
lg
Java:
/*
* RSA.java
*
*/
import java.math.BigInteger;
import java.util.Random;
/**
*
*/
public class RSA {
private BigInteger decryptionExponent;
private BigInteger encryptionExponent;
private BigInteger primeA;
private BigInteger primeB;
private BigInteger rsaModulus;
private BigInteger totient;
public RSA(BigInteger primeA, BigInteger primeB) {
this.primeA = primeA;
this.primeB = primeB;
rsaModulus = calculateRSAModulus(primeA, primeB);
totient = calculateTotient(primeA, primeB);
encryptionExponent = chooseEncryptionExponent(totient);
decryptionExponent = calculateDecryptionExponent(encryptionExponent, totient);
}
public static void main(String[] args) {
boolean correct = true;
for (int i = 0; i < 10000; i++) {
BigInteger plainText = BigInteger.valueOf(Math.abs(new Random().nextInt()));
RSA rsa = new RSA(BigInteger.valueOf(597853), BigInteger.valueOf(611953));
BigInteger cipherText = rsa.encrypt(plainText);
BigInteger newPlainText = rsa.decrypt(cipherText);
if (plainText.equals(newPlainText)) {
} else {
correct = false;
}
}
System.out.println("Korrekt: " + correct);
}
private BigInteger calculateRSAModulus(BigInteger primeA, BigInteger primeB){
this.primeA = primeA;
this.primeB = primeB;
return primeA.multiply(primeB);
}
private BigInteger calculateTotient(BigInteger primeA, BigInteger primeB){
this.primeA = primeA;
this.primeB = primeB;
BigInteger n = primeA.subtract(new BigInteger("1")).multiply(primeB.subtract(new BigInteger("1")));
return n;
}
private BigInteger chooseEncryptionExponent(BigInteger totient){
this.totient = totient;
Random zufall;
zufall = new Random();
BigInteger e = BigInteger.valueOf(zufall.nextInt(totient.intValue() - 1) + 1);
BigInteger b = new BigInteger("1");
while (e.compareTo(b) == -1 || e.compareTo(totient) == 1 || totient.mod(e).intValue() == 0
/**|| e.compareTo(new BigInteger("10")) == 1**/){
// überprüfen ob randomize, also der exponent e, kleiner gleich 1 oder größer gleich phi(totient) ist
// und ob bei der teilung von totient durch e ein rest übrig bleibt; schleife wird solange ausgeführt bis e
// halt größer 1 oder kleiner totient ist und der totient nicht teilbar durch e ist
e = BigInteger.valueOf(zufall.nextInt(totient.intValue() - 1) + 1);
}return e;
}
private BigInteger calculateDecryptionExponent(BigInteger encryptionExponent, BigInteger totient){
this.encryptionExponent = encryptionExponent;
this.totient = totient;
BigInteger d = new BigInteger("1");
while (encryptionExponent.multiply(d).mod(totient).equals(new BigInteger("1")) == false){
d = d.add(new BigInteger("1"));
}
return d;
}
private BigInteger encrypt(BigInteger plainText){
this.encryptionExponent = encryptionExponent;
this.rsaModulus = rsaModulus;
BigInteger b = new BigInteger("0");
BigInteger m;
if (plainText.compareTo(totient) == -1){
m = plainText.modPow(encryptionExponent, rsaModulus);
}
if ( plainText.compareTo(b) == 1){
m = plainText.modPow(encryptionExponent, rsaModulus);
}else{
m = new BigInteger("0");
}
return m;
}
private BigInteger decrypt(BigInteger cipherText){
this.decryptionExponent = decryptionExponent;
this.rsaModulus = rsaModulus;
BigInteger c;
c = cipherText.modPow(decryptionExponent, rsaModulus);
return c;
}
}
Zuletzt bearbeitet von einem Moderator: