2016-06-14 23 views
0

Ich schreibe ein Programm zum Verschlüsseln und Entschlüsseln von Text mit RSA. Die Werte von P, Q und E werden vom Benutzer zur Verfügung gestellt und überprüft, ob sie Primzahlen sind. Das Programm findet N und D. Die Verschlüsselung und Entschlüsselung sind fehlerhaft. Ich habe mir hier ein paar Fragen angeschaut und die meisten von ihnen benutzen Bibliotheken, die ich für diese Aufgabe nicht verwenden soll. Code-Schnipsel-Verschlüsselung:RSA-Entschlüsselung in Java, RSA-Bibliotheken nicht verwendet

JMenuItem mntmEncrypt = new JMenuItem("Encrypt"); 
mntmEncrypt.addActionListener(new ActionListener() { 
    @SuppressWarnings("null") 
    public void actionPerformed(ActionEvent ev) { 

     textArea_1.setText(""); 
     String blah = textArea.getText(); 
     int something; 

     for(int i=0; i<blah.length();i++){ 
      something =(int)(blah.charAt(i)); 

      enc = BigInteger.valueOf((long) (Math.pow(something, e)%n)); 

      textArea_1.append(blah.valueOf(enc) + " "); 
     } 

und Fehlfunktionen Entschlüsselung:

JMenuItem mntmDecrypt = new JMenuItem("Decrypt"); 
mntmDecrypt.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent em) { 
     textArea_1.setText(""); 
     String blah2 = textArea.getText(); 
     String[] somethingElse = blah2.split(" "); 
     char character; 
     for(int i=0;i<somethingElse.length;i++){ 
      int cipher = Integer.parseInt(somethingElse[i]);      

      dec = BigInteger.valueOf((long)Math.pow(cipher, d)%n); 

      System.out.println("Cipher: "+cipher); //print check 

      System.out.println("d: "+d); //print check 

      System.out.println("n: "+n); //print check 

      System.out.println("dec: "+dec); //print check 

      BigInteger x = BigInteger.valueOf(dec); 
      int x2 = x.intValue(); 
      char c = (char) x2; 

      System.out.println(cipher + " " + dec); 
      String textBack = new String(dec.toByteArray()); 

      textArea_1.append(String.valueOf(dec)); 
     } 
    } 
}); 

überprüfte ich den Wert von Dezember this calculator mit und es ist völlig falsch, aber ich kann nicht sehen, warum. Jede Hilfe wäre willkommen. Ich kann nichts BigInteger außer enc und dec machen.

Antwort

1

Die Antwort ist einfach: Sie verwenden Math.pow

Math.pow arbeitet auf double Werte - also nutzt sie Gleitkommazahlen. Fließkommazahlen sind nie exakt, daher ist Ihr Ergebnis an diesem Punkt bereits vermasselt. Wenn Sie wirklich RSA von Hand berechnen möchten, können Sie BigInteger.modPow(..) verwenden.

Allerdings ist Ihr Projekt kein Lernprojekt. Ich empfehle dringend, die Java Cryptography Extension zu verwenden. Verwenden Sie daher die BigInteger-Werte und erstellen Sie eine RSAPrivateKeySpec/RSAPublicKeySpec und verwenden Sie diese mit der Cipher-Klasse.

zum Beispiel Sehen Sie diese Frage: Generating RSA keys for given modulus and exponent

+0

Okay, aber zu BigInteger.modPow Schalt() würde erfordern, dass ihre Argumente sind alle BigIntegers mit zu beginnen, nicht wahr? Nicht in der Lage zu casten = sie müssen BigIntegers sein, um damit anzufangen. Dies verursacht Probleme mit vielen Dingen, einschließlich n = (p-1) (q-1). Von BigIntegern abzuziehen ist ein Schmerz. Wie würde ich das machen? Ich würde lieber die Kryptografie-Erweiterung verwenden, aber eine Lösung von Hand ist eine Voraussetzung. – Goblinette

+1

Sie haben es, Sie müssen alles mit BigInteger - jede Berechnung, wenn Ihre Nummer nicht in "long" passen. Du kannst leicht subtrahieren: 'value = value.subtract (BigInteger.ONE)' – Robert

+0

Ich versuche, es funktionieren zu lassen, aber da ich for-Schleifen verwende, um zu überprüfen, ob die Zahlen, die ich habe, prim sind oder nicht, gibt es noch mehr Probleme löse nun = (BigInteger hat eine prostablePrime-Methode, aber keine CheckIfPrime-Methode.) – Goblinette