Woran könnte es liegen, dass die Entschlüsselung der AES verschlüsselten Nachricht vom Client auf der Serverseite nicht korrekt funktioniert?
Beschreibung:
Ich habe eine Client-Server-Anwendung, bei der der Server einen Befehl an den Client sendet, der diesen Befehl auf dem Client ausführt und dann das Ausgaberesultat zurück an den Server schickt. Der Command-Output wird verschlüsselt, bevor er an den Server gesendet wird, und sollte auf der Serverseite entschlüsselt werden, um die Ausgabe anzuzeigen.
Ablauf:
Client:
public void executeCommand() {
try {
Process p = Runtime.getRuntime().exec("cmd /c " + commandInput);
p.getOutputStream().close();
InputStream processStdOutput = p.getInputStream();
Reader r = new InputStreamReader(processStdOutput);
BufferedReader br = new BufferedReader(r);
String line;
while ((line = br.readLine()) != null) {
writeToServerSocket("cmd18721378231dcad2");
writeToServerSocket(line + "\n");
writer.flush();
}
p.waitFor();
} catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}
public void writeToServerSocket(String message) {
try {
String encodedMessage = EncryptionHelper.encrypt(message);
writer.write(encodedMessage);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Server:
In einer Dauerschleife wird überprüft:
...
String encryptedInput = scanner.nextLine();
String input = EncryptionHelper.decrypt(encryptedInput); // Hier vermutlich Fehler
...
else if (input.contains("cmd18721378231dcad2")) {
String commandOutput = input.substring(19);
// Problem: Die Entschlüsselung des commandOutput funktioniert nicht korrekt
// Hier sollte der entschlüsselte Text angezeigt werden
controller.updatejTextAreaAllChat(commandOutput + "\n");
}
...
Problem:
Der verschlüsselte Command-Output wird vermutlich (nicht komplett sicher da System.out.println zum debuggen beim Server nicht funktioniert aus welchem Grund auch immer) erfolgreich an den Server gesendet, aber die Entschlüsselung auf der Serverseite funktioniert nicht wie erwartet. Der entschlüsselte Text wird nicht korrekt angezeigt, und es wird sobald ich die Anwendung beende die Fehlermeldung "Input byte array has incorrect ending byte" angezeigt.
Code für die Verschlüsselung/Entschlüsselung:
public class EncryptionHelper {
private static final String KEY = "mysecretkey";
public static String encrypt(String plainText) throws Exception {
// ... (Verschlüsselungslogik)
}
public static String decrypt(String encryptedText) throws Exception {
// ... (Entschlüsselungslogik)
}
}
Was habe ich bereits versucht:
- Die Übertragung der verschlüsselten Daten wurde überprüft und scheint intakt zu sein.
- Die Verschlüsselungslogik wurde überprüft und sie scheint korrekt zu sein.
- Andere Bereiche des Codes wurden überprüft, um sicherzustellen, dass sie das Entschlüsselungsproblem nicht verursachen.
2 Antworten
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.
Ah ok :D. Aber schön dass du deine Lösung finden konntest.
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!
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":