Hallo liebes Forum,
in PHP verschlüssele bzw. entschlüssele ich einen Text folgendermaßen:
Die verschlüsselte Nachricht wir dann über das Netzwerk an meinen Java-Server gesendet und wie folgt entschlüsselt:
Ich kann so Nachrichten wunderbar hin und herschicken, sofern die Länge der Nachricht <64 Zeichen bleibt. Anderfalls bekomme ich eine
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
Ich kann mir nicht erklären, wo da das Problem liegt. Die von PHP verschlüsselten Nachrichten kann ich mit PHP auch wieder erfolgreich entschlüsseln. Warum nicht in Java? Warum meint Java, dass die Nachricht nicht die blocksize 16 hat?
Vielen Dank für Hilfe
Gruß Goetz
in PHP verschlüssele bzw. entschlüssele ich einen Text folgendermaßen:
Code:
<?php
class EncryptionService{
private $key;
public function __construct($key){
$this->key = base64_decode($key);
}
public function encrypt($input) {
return base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$this->key,
$this->pkcs5_pad($input, 16),
MCRYPT_MODE_ECB
)
);
}
public function decrypt($input) {
return trim(mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$this->key,
base64_decode($input),
MCRYPT_MODE_ECB
), "\x00..\x1F"); // alle ASCII-Steuerzeichen abschneiden
}
private function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
}
Die verschlüsselte Nachricht wir dann über das Netzwerk an meinen Java-Server gesendet und wie folgt entschlüsselt:
Java:
package crypt;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.drools.util.codec.Base64;
public class EncryptionService {
private final String key;
public EncryptionService(String key) {
this.key = key;
}
public String crypt(String input) throws Exception {
byte[] crypted = null;
SecretKeySpec skey = new SecretKeySpec(Base64.decodeBase64(this.key), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
return Base64.encodeBase64String(crypted);
}
public String decrypt(String input) throws Exception {
byte[] output = null;
SecretKeySpec skey = new SecretKeySpec(Base64.decodeBase64(this.key), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skey);
output = cipher.doFinal(Base64.decodeBase64(input));
return new String(output);
}
}
Ich kann so Nachrichten wunderbar hin und herschicken, sofern die Länge der Nachricht <64 Zeichen bleibt. Anderfalls bekomme ich eine
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
Ich kann mir nicht erklären, wo da das Problem liegt. Die von PHP verschlüsselten Nachrichten kann ich mit PHP auch wieder erfolgreich entschlüsseln. Warum nicht in Java? Warum meint Java, dass die Nachricht nicht die blocksize 16 hat?
Vielen Dank für Hilfe
Gruß Goetz