Woran könnte es liegen, dass die Entschlüsselung der AES verschlüsselten Nachricht vom Client auf der Serverseite nicht korrekt funktioniert?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Hi,

das ganze sieht schonmal ordentlich aus. Im Internet zu dem Fehler "Input byte array has incorrect ending byte", dass die Decodierung des Base64-kodierten Textes ein Problem hat.
Schau mal, ob die übertragene verschlüsselte Nachricht nicht durch zusätzliche Zeilenumbrüche, Leerzeichen oder andere Zeichen anders aussieht.

Wenn nicht erstelle dein eigenes Log-File. Mach deine Nachrichten auf dem Client, als auch auf dem Server, dann kannst du Fehler eingrenzen.

Ansonsten kann ich dir nur den Standard -"Kram" erzählen, Base64-Kodierung überprüfen, Schlüsselabgleichen etc.


Maehdraschler 
Fragesteller
 13.08.2023, 22:05

Sorry für die späte Antwort. Letztendlich stellte sich heraus, dass der Fehler bei meinem Client lag. In der Methode "writeToServerSocket" habe ich die verschlüsselte Nachricht mit "writer.write" gesendet. Dies führte dazu, dass die verschlüsselte Nachricht mit dem vorherigen String mehr oder weniger kombiniert wurde. Dadurch konnte der Decoder die Nachricht nicht korrekt entschlüsseln. Hier ist die überarbeitete Version der Methode "writeToServerSocket" mit Verwendung von "writer.println" und anschließendem Aufruf von "writer.flush":

    public void writeToServerSocket(String message) {
    	try {
			String encodedMessage = EncryptionHelper.encrypt(message);
			writer.println(encodedMessage);
			writer.flush();
			//socket.shutdownOutput();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
1
public class EncryptionHelper {
	private static final String KEY = "mysecretkey"; // Der benutzerdefinierte Schlüssel


    public static String encrypt(String plainText) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);


        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }


    public static String decrypt(String encryptedText) throws Exception {
        SecretKeySpec secretKey = new SecretKeySpec(KEY.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);


        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }
}

Hier noch die komplette Klasse da sie oben keinen Platz mehr hatte!