Variablen Fehler bei der Entschlüsselung.

Lucaaa

Bekanntes Mitglied
Hallo!
Ich habe eine Klasse die einen Text mittels AES Ver- und auch wieder Entschlüsseln kann. Das Problem besteht nur darin, dass ich beim Erzeugen des Strings der den entschlüsselten Text enthält eine Exception bekomme. Komischerweise funktioniert es aber, wenn ich den String am ende der Verschlüsselungsmethode erzeuge. Bringt logischerweise aber nix.

Bitte um Hilfe!
Danke schon mal!

Java:
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
public class AesCipher {
 private static SecretKey key = null;
 
 
 public static void main(String[] args) {
  gen();
  
  String text = "Dies ist ein Text";
  String encrypted = new String(encrypt(text.getBytes()));
  String decrypted = new String(decrypt(encrypted.getBytes()));
  
  System.out.println("Original: " + text);
  System.out.println("Verschlüsselt: " + encrypted);
  System.out.println("Entschlüsselt: " + decrypted);  
 }
 
 
 private static void gen() {
  KeyGenerator keyGen = null;
  
  try {
   keyGen = KeyGenerator.getInstance("AES");
  } catch (NoSuchAlgorithmException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  keyGen.init(128);
  key = keyGen.generateKey();
 }
 
 private static byte[] encrypt(byte[] textBytes) {
  byte[] encryptedBytes = null;
  Cipher cipher = null;
  
  try {
   cipher = Cipher.getInstance("AES");
  } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   cipher.init(Cipher.ENCRYPT_MODE, key);
  } catch (InvalidKeyException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   try {
    encryptedBytes = cipher.doFinal(textBytes);
   } catch (IllegalBlockSizeException | BadPaddingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  
  
  
  
  return encryptedBytes;
 }
 
 
 private static byte[] decrypt(byte[] encryptedBytes) {
  byte[] decryptedBytes = null;
  Cipher cipher = null;
  
  try {
   cipher = Cipher.getInstance("AES");
  } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   cipher.init(Cipher.DECRYPT_MODE, key);
  } catch (InvalidKeyException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  try {
   decryptedBytes = cipher.doFinal(encryptedBytes);
  } catch (IllegalBlockSizeException | BadPaddingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  return decryptedBytes;
  
 }
 
}

Hier der Fehler:
Code:
javax.crypto.BadPaddingException: Given final block not properly padded
 at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
 at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
 at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
 at javax.crypto.Cipher.doFinal(Cipher.java:2165)
 at AesCipher.decrypt(AesCipher.java:88)
 at AesCipher.main(AesCipher.java:20)
Exception in thread "main" java.lang.NullPointerException
 at java.lang.String.<init>(Unknown Source)
 at AesCipher.main(AesCipher.java:20)
 
Dein Problem ist HIER gut beschrieben. Du kannst aus einem byte-array, dass kein StringEncoding besitzt einen String konvertieren und das gleiche Array zurückbekommen. Verwende einfach die byte-Arrays und dann passt das auch schon.
Java:
String text = "Dies ist ein Text";
byte[] encryptedBytes = encrypt(text.getBytes(), key);
String encrypted = new String(encryptedBytes);
byte[] enc = encrypted.getBytes();
byte[] decryptedBytes = decrypt(encryptedBytes, key);
String decrypted = new String(decryptedBytes);

System.out.println("Original: " + text);
System.out.println("Verschlüsselt: " + encrypted);
System.out.println("Entschlüsselt: " + decrypted);
 
Dein Problem ist HIER gut beschrieben. Du kannst aus einem byte-array, dass kein StringEncoding besitzt einen String konvertieren und das gleiche Array zurückbekommen. Verwende einfach die byte-Arrays und dann passt das auch schon.
Also unter reinem Java (Eclipse) klappt das wunderbar (Danke schonmal dafür) Allerdings soll es unter Android laufen. (da klappt es scheinbar so nicht). Ich brauche ja die decrypt-methode unabhängig von der encrypt-. Damit ich einen verschlüsselten Text später wieder entschlüsseln kann.
Hier der betroffene Code: (die en- und decrypt Methoden sind gleich wie vorhin)

Java:
...

} else if (id == R.id.button_verschluesseln_rsa) {
   // pubKey = setPublicKey();
        genAesKey();

        text = edt_eingabe.getText().toString();
        encryptedBytes = encryptAes(text.getBytes());
        encrypted = new String(encryptedBytes);
        tw_ausgabe.setText(encrypted);


} else if (id == R.id.button_entschluesseln_rsa) {
  //  priKey = setPrivateKey();


    encrypted = edt_eingabe.getText().toString();
    enc = encrypted.getBytes();
    decryptedBytes = decryptAes(enc);
    decrypted = new String(decryptedBytes);
    tw_ausgabe.setText(decrypted);
}

...
 
Hast du den Artikel gelesen und verstanden?
If you start with a byte[] and it does not in fact contain text data, there is no "proper conversion". Strings are for text, byte[] is for binary data, and the only really sensible thing to do is to avoid converting between them unless you absolutely have to.

If you really must use a String to hold binary data then the safest way is to use Base64 encoding.
 
Okay So funktioniert es:
Ich muss Base64 nutzen um es in Bytes/String zu konvertieren.
Das klappt dann auch.
Vielen Dank!

An die Nachwelt: so klapps:
Java:
} else if (id == R.id.button_verschluesseln_rsa) {
   // pubKey = setPublicKey();
        genAesKey();

        text = edt_eingabe.getText().toString();
        encryptedBytes = encryptAes(text.getBytes());
        encrypted = android.util.Base64.encodeToString(encryptedBytes, 0);
        tw_ausgabe.setText(encrypted);


} else if (id == R.id.button_entschluesseln_rsa) {
  //  priKey = setPrivateKey();


    encrypted = edt_eingabe.getText().toString();
    enc = android.util.Base64.decode(encrypted, 0);
    decryptedBytes = decryptAes(enc);
    decrypted = new String(decryptedBytes);
    tw_ausgabe.setText(decrypted);
}
 

Zurück
Oben