NullPointerException

Status
Nicht offen für weitere Antworten.

Sduni

Mitglied
folgendes Problem:

Java:
	public RSA(BigInteger primaA, BigInteger primeB) throws IllegalArgumentException{
		if(primeA.isProbablePrime(-9) && primeB.isProbablePrime(-9) &&
 (!primeA.equals(new BigInteger("2")) || !primeA.equals(new BigInteger("3")))
 && (!primeB.equals(new BigInteger("2")) || !primeB.equals(new BigInteger("3")))){
			this.primeA = primeA;
			this.primeB = primeB;
			rsaModulus = calculateRSAModulus();
			totient = calculateTotient();
			encryptionExponent = chooseEncryptionExponent();
			decryptionExponent = calculateDecryptionExponent();
		}else{
			throw new IllegalArgumentException("Keine Primzahl" + ex.getMessage());
		}
	}
    
    public static void main(String[] args) {
        boolean correct = true;
        for (int i = 0; i < 1000; i++) {
            BigInteger plainText = BigInteger.valueOf(Math.abs(new Random().nextInt()));
            RSA rsa = new RSA(BigInteger.valueOf(Integer.parseInt(args[0])), BigInteger.valueOf(Integer.parseInt(args[1])));
            BigInteger cipherText = rsa.encrypt(plainText);
            BigInteger newPlainText = rsa.decrypt(cipherText);
            if (plainText.equals(newPlainText)) {
            } else {
                correct = false;
            }
        }
        System.out.println("Korrekt: " + correct);
    }

Es soll eine IllegalArgumentException geworfen werden, wenn primeA und B keine Primzahl ist oder halt 2 u. 3.

Bekomme aber bei der Ausführung eine NullPointerException. Versteh ich nicht ganz. Fehlt noch etwas bei der main methode? Wenn ich z.B. zwei Primzahlen übergebe, bekomme ich trotzdem diese NulLP...Ex...? Was ist daran Null? Er führt doch dann den RSA Konstruktor mit den Werten und Methoden aus ???:L
 
Zuletzt bearbeitet:
S

SlaterB

Gast
der Code ist nicht kompilierbar, enthält zum einen wahrscheinlich gekürzte nun recht sinnlosen Befehle
> throw new IllegalArgumentException("Keine Primzahl" + ex.getMessage());
was ist ex?

enthält falsche Variablen-Namen
> public RSA(BigInteger primaA, BigInteger primeB) throws IllegalArgumentException{
> if(primeA.

primeA != primaA

enthält unbekannte Methodenaufrufe mit noch mehr unbekannten Variablen
> rsa.encrypt(plainText);

enthält eine unnötige 1000er-Schleife, obwohl doch immer das gleiche passiert?

aber keine NullPointerException ;)
 

Sduni

Mitglied
der Code ist nicht kompilierbar, enthält zum einen wahrscheinlich gekürzte nun recht sinnlosen Befehle
> throw new IllegalArgumentException("Keine Primzahl" + ex.getMessage());
was ist ex?
getMessage war vom try to catch. ist behoben!


enthält falsche Variablen-Namen
> public RSA(BigInteger primaA, BigInteger primeB) throws IllegalArgumentException{
> if(primeA.

primeA != primaA

:oops: danke

enthält unbekannte Methodenaufrufe mit noch mehr unbekannten Variablen
> rsa.encrypt(plainText);

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) throws IllegalArgumentException{
if(primeA.isProbablePrime(-9) && primeB.isProbablePrime(-9)
 && (!primeA.equals(new BigInteger("2")) || !primeA.equals(new BigInteger("3")))
 && (!primeB.equals(new BigInteger("2")) || !primeB.equals(new BigInteger("3")))){
			this.primeA = primeA;
			this.primeB = primeB;
			rsaModulus = calculateRSAModulus();
			totient = calculateTotient();
			encryptionExponent = chooseEncryptionExponent();
			decryptionExponent = calculateDecryptionExponent();
		}else{
			throw new IllegalArgumentException("Keine Primzahl");
		}
	}
    
    public static void main(String[] args) {
        boolean correct = true;
        for (int i = 0; i < 1000; i++) {
            BigInteger plainText = BigInteger.valueOf(Math.abs(new Random().nextInt()));
            RSA rsa = new RSA(BigInteger.valueOf(Integer.parseInt(args[0])), BigInteger.valueOf(Integer.parseInt(args[1])));
            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(){
    	this.primeA = primeA;
		this.primeB = primeB;
		BigInteger a = primeA.multiply(primeB);
		System.out.println("RSA:" + a.toString());
    	return a;
    }
    
	private BigInteger calculateTotient(){
		this.primeA = primeA;
		this.primeB = primeB;
		BigInteger n = primeA.subtract(BigInteger.ONE).multiply(primeB.subtract(BigInteger.ONE));
		System.out.println("Totient: " + n.toString());
   		return n;
	}

	
	private BigInteger chooseEncryptionExponent(){
		this.totient = totient;
		Random zufall;
        zufall = new Random();
        BigInteger e = BigInteger.valueOf(zufall.nextInt(totient.intValue())+1);
       	while (!totient.gcd(e).equals(BigInteger.ONE)){
           	e = BigInteger.valueOf(zufall.nextInt(totient.intValue())+1);
        }
        System.out.println("VExponent: " + e.toString());
        return e;
	}

	
	private BigInteger calculateDecryptionExponent(){
		this.encryptionExponent = encryptionExponent;
		this.totient = totient;
		BigInteger d = BigInteger.ONE;
		d = encryptionExponent.modInverse(totient);
		System.out.println("DExponent: " + d.toString());
   		return d;
	}
	
	private BigInteger encrypt(BigInteger plainText){
		this.encryptionExponent = encryptionExponent;
		this.rsaModulus = rsaModulus;
		BigInteger m = BigInteger.ONE;
		m = plainText.modPow(encryptionExponent, rsaModulus);
		System.out.println("cipherText: " + m.toString());
		return m;
	}
	
	private BigInteger decrypt(BigInteger cipherText){
		this.decryptionExponent = decryptionExponent;
		this.rsaModulus = rsaModulus;
		BigInteger c;
		c = cipherText.modPow(decryptionExponent, rsaModulus);
		System.out.println("plainText: " + c.toString());
		return c;
	}
}

führt nun alles schön aus, ohne Exception ???:L Gibt immer nen false am Ende. Kann mir mal jemand die isProbablePrime erklären?In unserer Aufgabe heißt es:

das mit einer Wahrscheinlichkeit von höchtens 10^−9 falsch ist, als immer korrekt annehmen

ich setze also .isProbablePrime(-9) oder?

enthält eine unnötige 1000er-Schleife, obwohl doch immer das gleiche passiert?

aber keine NullPointerException ;)

nööö, gibt immer nen anderen plainText pro Schleifendurchlauf ;)
 

Sduni

Mitglied
in der API steht schon ein bisschen zur Methode,
unter anderem

-9 ist also ein schlechter Parameter

da sind wir bei mathe :(

also nehm ich jetzt 0.000000001 als certainty? das ist aber kein integer?

oder soll allgemein als sicherheit 0.00000001? wie kann ich das auf 1-1/2^certainty umrechnen? bissl strange für mich...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
verstehst du denn den Sinn der Formel 1-1/2^certainty?
- ist Minus, ^ ist hoch

setze doch ein paar Werte ein um die Tendenz festzustellen, und immer schön langsam mit 1, 2, 3 oder von mir aus 0.1 anfangen

eine Wahrscheinlichkeit von 1 wäre übrigens anzustreben, 1 = 100%
 

Sduni

Mitglied
jop versteh ich soweit...

Wird halt nie 100%, nähert sich nur an! Aber in der Aufgabe steht: Eine Wahrscheinlichkeit von 10^-9. Das versteh ich nicht ganz... also sowas ungefähr: 0.9999999992314245?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
kommt ungefähr hin, 1 minus das müsste kleiner 10^-9 sein,
auf die ein oder andere 0-Stelle kommt es sicher nicht so exakt an
 
Status
Nicht offen für weitere Antworten.

Oben