Heim >Java >javaLernprogramm >Warum schlägt meine Java 3DES-Verschlüsselung/Entschlüsselung fehl?

Warum schlägt meine Java 3DES-Verschlüsselung/Entschlüsselung fehl?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-11 00:18:02543Durchsuche

Why Is My Java 3DES Encryption/Decryption Failing?

Fehlerbehebung bei der 3DES-Verschlüsselung/-Entschlüsselung in Java

Problem:

Eine Zeichenfolge konnte mit der 3DES-Verschlüsselung nicht erfolgreich ver- und entschlüsselt werden aufgrund wiederkehrender Fehler bei der Code-Implementierung.

Lösung:

Um das Problem zu beheben, analysieren wir den bereitgestellten Code:

public class TripleDESTest {

    // ...

    public byte[] encrypt(String message) {
        // ...

        final byte[] plainTextBytes = message.getBytes("utf-8");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);
        final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText);

        return cipherText;    
    }

    // ...
}

Base64-Kodierungsfehler:

Anfangs enthielt der Code die Zeile final String encodedCipherText = new sun.misc.BASE64Encoder().encode(cipherText); für Base64-Codierung des Chiffretextes vor der Rückgabe. Da jedoch bei der Entschlüsselungsmethode keine Base64-Kodierung verwendet wurde, sollte der Chiffretext direkt als Byte-Array zurückgegeben werden.

Rohbyte-Arrays drucken:

Die Code gibt sowohl die verschlüsselten als auch die entschlüsselten Daten als Byte-Arrays aus: System.out.println(codedtext); und System.out.println(decodedtext);. Dies liefert keine aussagekräftige Ausgabe, da Byte-Arrays nicht als für Menschen lesbare Werte dargestellt werden. Um den tatsächlichen entschlüsselten Text anzuzeigen, konvertieren Sie ihn mit new String(plainText, „UTF-8“) in einen String.

Korrigierter Code:

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;

public class TripleDESTest {

    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(decodedtext);
    }

    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");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);

        return cipherText;
    }

    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");
    }
}

Das obige ist der detaillierte Inhalt vonWarum schlägt meine Java 3DES-Verschlüsselung/Entschlüsselung fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn