# Verschlüsselungsproblem (BadPaddingException)



## LStrike (4. Mrz 2010)

Moin moin,

ich versuche gerade einen String mittels eines Passwortes zu ver- und entschlüsseln.
Das Verschlüsseln mit Passwort funktioniert schon, allerdings die Entschlüsselung nicht, ich bekomme dort eine "BadPaddingException".
Ich hatte gedacht, dass das doFinal() das für mich erledigt.

Kann mir jemand helfen wo mein (Gedanken-)Fehler ist?

Danke schon mal.

Gruß LStrike


```
public class KryptTest2 {

	byte[] salt = {
              (byte)0xc7, (byte)0x73, (byte)0x21, (byte)0x8c,
              (byte)0x7e, (byte)0xc8, (byte)0xee, (byte)0x99
              };
    int count=20;


//....hier ist noch eine main und anderes Geraffel was nicht zum Problem gehört.

// Schlüssel erzeugen
	private SecretKey makeKeyFromPassword(String passwort) {
		 
		PBEKeySpec pbeKeySpec = new PBEKeySpec(passwort.toCharArray());
	    try{
	    	SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
	    	SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
	    	return pbeKey;
	    }
	    catch(NoSuchAlgorithmException e){ 
	    	return null;}
	    catch(InvalidKeySpecException e1){
	        return null;
	                }
	}

	// Verschluesselung und Entschluesselung
	private String verschlüsseln(String nachricht, SecretKey secretKey) {
		try{
			PBEParameterSpec pbeParamSpec= new PBEParameterSpec(salt, count);
			Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
			pbeCipher.init(Cipher.ENCRYPT_MODE, secretKey, pbeParamSpec);
			byte[] ciphertext= pbeCipher.doFinal(nachricht.getBytes());
			return new String(ciphertext);	
		}
		catch (Exception e){
			return null;
		}
		    
	}
	private String entschlüsseln(String nachricht, SecretKey secretKey) {
		try{
			PBEParameterSpec pbeParamSpec= new PBEParameterSpec(salt, count);
			Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
	        pbeCipher.init(Cipher.DECRYPT_MODE, secretKey, pbeParamSpec);
	        byte[] ciphertext= pbeCipher.doFinal(nachricht.getBytes());
	      return new String(ciphertext);
	} 
	catch (Exception e){
		return null;
		}
	}
```


----------



## kay73 (7. Mrz 2010)

Schwer zu sagen, was da genau schiefgeht. Meine Vermutung: Die Konvertierung zum String macht die Chiffre kaputt. Es gab auch einen Bug, der dieses Problem verursachte: 4414138. Darüber hinaus impliziert PBEWithMd5AndDES CBC und PKCS5Padding, also 
	
	
	
	





```
Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding");
```
 siehe Eintrag in der Java ™ Cryptography Architecture Standard Algorithm Name Documentation. Bei mir geht es aber auch ohne. 

Ich habe es nicht wesentlich geändert, aber jedenfalls am Laufen:
	
	
	
	





```
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class Encrypt {

    final String PBEWithMD5AndDES = "PBEWithMD5AndDES";
    final int iterations = 8;
    final byte[] salt = {
        (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
        (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99
    };

    public SecretKey makeKeyFromPassword(String passwort) throws NoSuchAlgorithmException, InvalidKeySpecException {

        final KeySpec pbeKeySpec = new PBEKeySpec(passwort.toCharArray());
        return SecretKeyFactory.getInstance(PBEWithMD5AndDES).generateSecret(pbeKeySpec);
    }

    private byte[] doCrypt(final byte[] cipher, final SecretKey secretKey, int mode) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

        final AlgorithmParameterSpec pbeParamSpec = new PBEParameterSpec(salt, iterations);
        final Cipher pbeCipher = Cipher.getInstance(PBEWithMD5AndDES);

        pbeCipher.init(mode, secretKey, pbeParamSpec);
        return pbeCipher.doFinal(cipher);
    }

    public byte[] encrypt(final String nachricht, final SecretKey secretKey) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
        return doCrypt(nachricht.getBytes(), secretKey, Cipher.ENCRYPT_MODE);
    }

    public String decrypt(final byte[] nachricht, final SecretKey secretKey) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
        return new String(doCrypt(nachricht, secretKey, Cipher.DECRYPT_MODE));
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {

        final String plainText = "Hallo Welt1234xyz578zyx";
        final String password = "geheim!123";

        final Encrypt encrypt = new Encrypt();
        final SecretKey secretKey = encrypt.makeKeyFromPassword(password);

        final byte[] cipher = encrypt.encrypt(plainText, secretKey);
        final String decrypted = encrypt.decrypt(cipher, secretKey);

        System.out.println(plainText.equals(decrypted) ? decrypted : "failed!");
    }
}
```


----------



## LStrike (8. Mrz 2010)

Cool, vielen Dank.

Ich starre seit 3 Tagen ununterbrochen auf den Code und sehe nichts 
Jetzt muss das ganze nur noch in mein Android Projekt.

Danke schön nochmal, jetzt kann ich endlich weiter machen.


----------

