So verwenden Sie die 3DES-Verschlüsselung und -Entschlüsselung in Java

Moderne Anwendungen erfordern häufig eine sichere Möglichkeit, mit sensiblen Daten umzugehen. Ein beliebter Verschlüsselungsalgorithmus, auf den Sie stoßen könnten, ist 3DES (Triple Data Encryption Standard). Wenn Sie versuchen, Strings mit 3DES in Java zu verschlüsseln und zu entschlüsseln, können Sie auf Probleme stoßen, wie das häufige Problem von Entwicklern: die Unfähigkeit, eine Nachricht in ihre ursprüngliche Form zurückzuentschlüsseln. Dieser Beitrag wird Ihnen helfen zu verstehen, wie Sie die 3DES-Verschlüsselung und -Entschlüsselung korrekt in Java verwenden.

Das Problem

Stellen Sie sich vor, Sie haben einige Codezeilen geschrieben, um einen String zu verschlüsseln – sagen wir, der String “kyle boon”. Nach dem Ausführen Ihrer Verschlüsselungsmethode versuchen Sie, das Ergebnis zu decodieren, schaffen es jedoch nicht, den ursprünglichen String zurückzubekommen. Viele Entwickler stehen vor einer ähnlichen Herausforderung, oft aufgrund der unsachgemäßen Handhabung von Byte-Arrays oder fehlender kritischer Schritte in ihrem Code.

Ein Entwickler teilte mit: „Jede Methode, die ich schreibe, um einen String in Java mit 3DES zu kodieren, kann nicht in den ursprünglichen String zurück entschlüsselt werden.“ Dieser häufige Fehler rührt oft von einem Missverständnis darüber, wie Byte-Arrays und String-Darstellungen in Java funktionieren.

Die Lösung

Lassen Sie uns eine vereinfachte, korrigierte Implementierung der 3DES-Verschlüsselung und -Entschlüsselung in Java betrachten. Dieser Code ermöglicht es Ihnen, eine Texteingabe zu verschlüsseln und dann leicht in den ursprünglichen Text zurück zu entschlüsseln.

Schritt-für-Schritt-Codeerklärung

  1. Imports:

    import java.security.MessageDigest;
    import java.util.Arrays;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    
  2. Klassen Definition:

    public class TripleDESTest {
    
  3. Hauptmethode: In Ihrer Hauptmethode definieren Sie zunächst den zu verschlüsselnden Text.

    public static void main(String[] args) throws Exception {
        String text = "kyle boon";
        byte[] codedtext = new TripleDESTest().encrypt(text);
        String decodedtext = new TripleDESTest().decrypt(codedtext);
    
        System.out.println(codedtext);
        System.out.println(decodedtext); // "kyle boon"
    }
    
  4. Verschlüsselungsmethode: Diese Methode kodiert die Eingabemeldung mit dem 3DES-Algorithmus:

    public byte[] encrypt(String message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9".getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
    
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }
    
        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        final byte[] plainTextBytes = message.getBytes("utf-8");
        return cipher.doFinal(plainTextBytes);
    }
    
  5. Entschlüsselungsmethode: Diese Methode kehrt den Verschlüsselungsprozess um:

    public String decrypt(byte[] message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9".getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
    
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }
    
        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        decipher.init(Cipher.DECRYPT_MODE, key, iv);
        final byte[] plainText = decipher.doFinal(message);
    
        return new String(plainText, "UTF-8"); // Konvertieren des Byte-Arrays in einen String
    }
    

Wichtige Erkenntnisse

  • Richtige Handhabung von Byte-Arrays: Stellen Sie beim Decodieren sicher, dass Sie das Byte-Array mit new String(plainText, "UTF-8") zurück in einen String konvertieren, anstatt toString() darauf aufzurufen. Dies vermeidet Müllausgaben.

  • Base64-Kodierung: Wenn Sie das verschlüsselte Byte-Array über ein Textmedium übertragen möchten, sollten Sie die Base64-Kodierung in Betracht ziehen. Stellen Sie sicher, dass Sie es während der Entschlüsselung korrekt dekodieren.

  • Fehlerbehandlung: Der Code enthält eine Fehlerbehandlung, um verschiedene Verschlüsselungsfehler zu verwalten, was ihn robust macht.

Jetzt haben Sie einen klaren und effektiven Ansatz zur Verwendung von 3DES-Verschlüsselung und -Entschlüsselung in Ihren Java-Anwendungen. Indem Sie die obige Erklärung und die Codebeispiele befolgen, können Sie diese leistungsstarke Verschlüsselungsmethode erfolgreich implementieren.