# Java und AES-Decrypt (CBC)



## meinereiner85 (2. März 2009)

Hallo alle zusammen,

ich versuche einen verschlüsselten String zu dekodieren, der mir von einer Applikation geschickt wird.
Zur Verschlüsslung habe ich folgende Infos:
- Typ: AES 128 bit
- Mode: CBC
- Blocklänge 16 byte (padding)
- IV -> random
- Key -> p_key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 

Die Applikation auf der Gegenseite macht folgendes:
Es wird ein frei gewählter String nach oben beschriebenen Verfahren verschlüsselt und in Hex-Form zu mir übertrage. Ein Beispiel von solch einem verschlüsselten Block sähe so aus:
802E5AF8892463EE921A6CE49B1075DA

Jetzt möchte ich das ganze gerne wieder entschlüsseln.

Ich habe folgende Appliaktion begonnen, die allerdings immer in einen Fehler läuft:

```
byte[] raw = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] encrypted = HexToChar("802E5AF8892463EE921A6CE49B1075DA");
cipher.init(Cipher.DECRYPT_MODE,skeySpec);
byte[] original = cipher.doFinal(encrypted);
String originalString = new String(original);
System.out.println("Original string: " + originalString);
```

Ich bekomme immer wieder die Fehlermeldung, dass Parameter fehlen:
java.security.InvalidKeyException: Parameters missing
        at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
        at com.sun.crypto.provider.AESCipher.engineInit(DashoA13*..)
...


Kann mir einer sagen, wie ich mein Problem beheben kann?

Würde mich über Hilfe sehr freuen.
Vielleicht kann mir ja jemand sagen, was ich kodiert habe? 

Gruß
meinereiner


----------



## pizza1234 (3. März 2009)

Hi, 

ich schätze, dir fehlt der SecureRandom in der Methode:


> cipher.init(Cipher.DECRYPT_MODE,skeySpec);


 Schau dir mal die init-Methode in der API genauer an.

Grüße,
Peter


----------



## meinereiner85 (3. März 2009)

Hallo,

und Danke für deien Antwort.
Das habe ich auchs chon versucht. Mein Problem ist nur, dass meine Apllikationen nur einen Randomvektor erstellt.
Ich kann deswegen beim skeySpec leider nicht mit SHA1 o.ä. initialisieren.

Oder sehe ich da was falsch?

Gruß
meinereiner


----------



## pizza1234 (3. März 2009)

Hi,

versuchs mal so:

```
IvParameterSpec iv = new IvParameterSpec(raw );
cipher.init(Cipher.DECRYPT_MODE,skeySpec,iv);
```

du brauchst zum Initialisieren den IvParameterSpec:http://java.sun.com/j2se/1.4.2/docs/api/javax/crypto/spec/IvParameterSpec.html

Grüße,
Peter


----------



## meinereiner85 (3. März 2009)

Hallo,

Danke für den Tipp.

Jetzt bekomme ich allerdings folgende Fehlermeldung "Given final block not properly padded".

Verstehe ich aber irgendwie nicht, da ich nichts anderes von meiner anderen Applikation bekomme.

Hast du eine Idee an was das liegen kann?

Gruß
meinereiner


----------



## pizza1234 (3. März 2009)

Hi,

Google meint dazu:


> 1) You converted the encrypted data to a String using something like
> String encryptedAsString = new String(encryptedAsByte);
> which , depending on the default chaaracter encoding, may not be reversible.
> 
> ...



Grüße,
Peter


----------

