Comment utiliser l’encryptage et le décryptage 3DES en Java

Les applications modernes nécessitent souvent un moyen sécurisé de gérer des données sensibles. Un algorithme de chiffrement populaire que vous pourriez rencontrer est le 3DES (Triple Data Encryption Standard). Si vous essayez d’encrypter et de décrypter des chaînes en utilisant 3DES en Java, vous pourriez rencontrer des problèmes, comme l’illustre un problème courant parmi les développeurs : l’incapacité de déchiffrer un message dans sa forme originale. Cet article vous aidera à comprendre comment utiliser correctement l’encryptage et le décryptage 3DES en Java.

Le problème

Imaginez que vous avez écrit du code pour chiffrer une chaîne—disons, la chaîne “kyle boon.” Après avoir exécuté votre méthode d’encryptage, vous essayez de décoder le résultat mais échouez à récupérer la chaîne originale. De nombreux développeurs sont confrontés à un défi similaire, souvent à cause d’une mauvaise manipulation des tableaux d’octets ou d’omissions d’étapes critiques dans leur code.

Un développeur a partagé : “Chaque méthode que j’écris pour coder une chaîne en Java en utilisant 3DES ne peut pas être déchiffrée à la chaîne originale.” Cette erreur courante provient généralement d’une mauvaise compréhension du fonctionnement des tableaux d’octets et des représentations de chaînes en Java.

La solution

Examinons une mise en œuvre simplifiée et corrigée de l’encryptage et du décryptage 3DES en Java. Ce code vous permet d’encrypter une entrée texte, puis de la déchiffrer facilement pour revenir au texte original.

Explication étape par étape du code

  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. Définition de la classe :

    public class TripleDESTest {
    
  3. Méthode principale : Dans votre méthode principale, vous allez d’abord définir le texte à encrypter.

    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. Méthode d’encryptage : Cette méthode encode le message d’entrée en utilisant l’algorithme 3DES :

    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. Méthode de décryptage : Cette méthode inverse le processus d’encryptage :

    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"); // Convertir le tableau d'octets en chaîne
    }
    

Points clés à retenir

  • Manipulez correctement les tableaux d’octets : Lors du décodage, assurez-vous de convertir le tableau d’octets en une chaîne en utilisant new String(plainText, "UTF-8") au lieu d’appeler toString() dessus. Cela évite d’obtenir une sortie erronée.

  • Encodage Base64 : Si vous prévoyez de transmettre le tableau d’octets chiffré sur un support texte, considérez l’utilisation de l’encodage Base64. Assurez-vous de le décoder correctement lors du décryptage.

  • Gestion des exceptions : Le code contient une gestion des exceptions pour gérer divers erreurs de chiffrement, rendant le tout robuste.

Maintenant, vous avez une approche claire et efficace pour utiliser l’encryptage et le décryptage 3DES dans vos applications Java. En suivant l’explication ci-dessus et les extraits de code, vous pouvez mettre en œuvre cette méthode de chiffrement puissante avec succès.