Maison >Java >javaDidacticiel >Pourquoi le chiffrement et le déchiffrement 3DES en Java ne parviennent-ils généralement pas à déchiffrer le texte chiffré jusqu'à la chaîne d'origine, et comment ce problème peut-il être résolu ?

Pourquoi le chiffrement et le déchiffrement 3DES en Java ne parviennent-ils généralement pas à déchiffrer le texte chiffré jusqu'à la chaîne d'origine, et comment ce problème peut-il être résolu ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-11 03:21:02359parcourir

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?

Cryptage et décryptage 3DES en Java

Habituellement, un problème courant se produit lors de l'utilisation de 3DES pour crypter et déchiffrer des chaînes en Java, entraînant l'incapacité de déchiffrer avec succès le texte chiffré. . Renvoie la chaîne d'origine. Cet article fournit un exemple de code simple permettant de chiffrer et de déchiffrer une chaîne et de la restaurer à la chaîne d'origine.

Dans la question d'origine, le code donné comporte l'erreur suivante :

  • Dans la méthode de cryptage, le résultat du cryptage est renvoyé directement au lieu de l'encoder en Base64.
  • Dans la méthode de décryptage, le résultat du cryptage est directement utilisé comme entrée des données décryptées au lieu du décodage Base64 en premier.

Le code corrigé est le suivant :

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

Après avoir utilisé les étapes correctes d'encodage et de décodage Base64, le code peut crypter et décrypter avec succès la chaîne en 3DES et garantir le résultat déchiffré. est correctement restauré à la chaîne d'origine.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn