# NullPointerException



## Sduni (1. Dez 2009)

folgendes Problem:


```
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


----------



## SlaterB (1. Dez 2009)

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 (1. Dez 2009)

> 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



 danke



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




```
/*
 * 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


----------



## SlaterB (1. Dez 2009)

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


> If certainty is  <= 0, true is returned.


-9 ist also ein schlechter Parameter


----------



## Sduni (1. Dez 2009)

SlaterB hat gesagt.:


> 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...


----------



## SlaterB (1. Dez 2009)

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 (1. Dez 2009)

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?


----------



## SlaterB (1. Dez 2009)

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


----------

