AES Verschlüsselung nur bis 63 Zeichen Länge

GoetzEisenfaust

Neues Mitglied
Hallo liebes Forum,

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
 
Das Problem ist das du direkt doFinal() callst. Wenn du längere Daten verschlüsseln willst musst du mit update() arbeiten und die Blöcke selbst teilen. Ich hatte dazu mal n super Code, ist aber leider verschollen gegangen. Auf jeden Fall ziemlich kompliziert mit getBlockSize() und getOutputSize() ... vielleicht findest du ja mit diesen Begriffen was bei GooGLe. Außerdem würde ich wenn du schon mit PKCS5 arbeitest eher CBC anstatt ECB nehmen und das ganze als Stream-Cipher bauen. Wie weit PHP da mit macht kann ich so leider nicht sagen.
 
Danke schonmal für die Hilfe,

ich habe jetzt noch ein paar interessante Fakten festgestellt.
- Wenn ich einen String mit mehr als 63 Zeichen in Java mit der im ersten Beitrag gezeigten Klasse verschlüssele, dann kann ich ihn einwandfrei wieder entschlüsseln.

- Wenn ich einen Text mit mehr als 63 Zeichen in PHP und in Java verschlüssele, dann bekomme ich in beiden Sprachen den gleichen Base64-encodeten Text heraus.

Kann es sein, dass durch das Schicken über die Leitung der verschlüsselte Text minimal verändert wird und das zum Problem führt?

Edit: Meine Vermutung hat sich bestätigt. 😀

Ich habe folgende Zeilen zum Auslesen der Nachricht aus dem InputStream verwendet:
Java:
char[] buffer = new char[2000];
int anzahlZeichen = bufferedReader.read(buffer, 0, 100);
String nachricht = new String(buffer, 0, anzahlZeichen);

Klar, dass die ankommende Base64-encodete Zeichenkette nicht größer als 100 Zeichen wird. 😳

Das Problem ist damit also gelöst. ^^

Danke Goetz
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben