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
Libérer: 2024-11-11 03:21:02
original
315 Les gens l'ont consulté

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");
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal