Heim  >  Artikel  >  Java  >  Warum gelingt es der 3DES-Verschlüsselung und -Entschlüsselung in Java normalerweise nicht, den Chiffretext wieder in die ursprüngliche Zeichenfolge zu entschlüsseln, und wie kann dieses Problem gelöst werden?

Warum gelingt es der 3DES-Verschlüsselung und -Entschlüsselung in Java normalerweise nicht, den Chiffretext wieder in die ursprüngliche Zeichenfolge zu entschlüsseln, und wie kann dieses Problem gelöst werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-11 03:21:02279Durchsuche

Why does 3DES encryption and decryption in Java usually fail to decrypt the ciphertext back to the original string, and how can this issue be resolved?

3DES-Verschlüsselung und -Entschlüsselung in Java

Normalerweise tritt bei der Verwendung von 3DES zum Ver- und Entschlüsseln von Zeichenfolgen in Java ein häufiges Problem auf, das dazu führt, dass der Chiffretext nicht erfolgreich entschlüsselt werden kann . Gibt die ursprüngliche Zeichenfolge zurück. Dieser Artikel enthält ein einfaches Codebeispiel, mit dem eine Zeichenfolge ver- und entschlüsselt und auf die ursprüngliche Zeichenfolge zurückgesetzt werden kann.

In der ursprünglichen Frage weist der angegebene Code den folgenden Fehler auf:

  • Bei der Verschlüsselungsmethode wird das Verschlüsselungsergebnis direkt zurückgegeben, anstatt es mit Base64 zu kodieren.
  • Bei der Entschlüsselungsmethode wird das Verschlüsselungsergebnis direkt als Eingabe der entschlüsselten Daten verwendet, anstatt zuerst Base64 zu dekodieren.

Der korrigierte Code lautet wie folgt:

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(codedtext); // this is a byte array, you'll just see a reference to an array
        System.out.println(decodedtext); // This correctly shows "kyle boon"
    }

    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);
        final String encodedCipherText = new sun.misc.BASE64Encoder()
                .encode(cipherText);

        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[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message);
        final byte[] plainText = decipher.doFinal(encData);

        return new String(plainText, "UTF-8");
    }
}

Nachdem die korrekten Base64-Codierungs- und Decodierungsschritte verwendet wurden, kann der Code die Zeichenfolge erfolgreich mit 3DES verschlüsseln und entschlüsseln und das entschlüsselte Ergebnis sicherstellen wird korrekt auf die ursprüngliche Zeichenfolge zurückgesetzt.

Das obige ist der detaillierte Inhalt vonWarum gelingt es der 3DES-Verschlüsselung und -Entschlüsselung in Java normalerweise nicht, den Chiffretext wieder in die ursprüngliche Zeichenfolge zu entschlüsseln, und wie kann dieses Problem gelöst werden?. 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