Como Usar Criptografia e Descriptografia 3DES em Java

Aplicações modernas frequentemente requerem uma maneira segura de lidar com dados sensíveis. Um algoritmo de criptografia popular que você pode encontrar é o 3DES (Triple Data Encryption Standard). Se você está tentando criptografar e descriptografar strings usando 3DES em Java, pode encontrar problemas, como exemplificado por um desafio comum entre desenvolvedores: a incapacidade de descriptografar uma mensagem de volta para sua forma original. Este post ajudará você a entender como usar corretamente a criptografia e descriptografia 3DES em Java.

O Problema

Imagine que você escreveu algum código para criptografar uma string—vamos dizer, a string “kyle boon.” Depois de executar seu método de criptografia, você tenta decodificar o resultado, mas falha em obter a string original. Muitos desenvolvedores enfrentam um desafio semelhante, frequentemente devido a um manuseio inadequado de arrays de bytes ou à falta de etapas críticas em seu código.

Um desenvolvedor compartilhou: “Todo método que escrevo para codificar uma string em Java usando 3DES não consegue ser descriptografado de volta para a string original.” Esse erro comum geralmente decorre do mal-entendido de como arrays de bytes e representações de strings funcionam em Java.

A Solução

Vamos dar uma olhada em uma implementação corrigida e simplificada de criptografia e descriptografia 3DES em Java. Este código permite que você criptografe um texto de entrada e, em seguida, o descriptografe facilmente de volta para o texto original.

Explicação do Código Passo a Passo

  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. Definição da Classe:

    public class TripleDESTest {
    
  3. Método Principal: Em seu método principal, você primeiro definirá o texto a ser criptografado.

    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étodo de Criptografia: Este método codifica a mensagem de entrada usando o algoritmo 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étodo de Descriptografia: Este método reverte o processo de criptografia:

    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"); // Converter array de bytes para string
    }
    

Principais Aprendizados

  • Manipulação Correta de Arrays de Bytes: Ao decodificar, certifique-se de converter o array de bytes de volta em uma string usando new String(plainText, "UTF-8") em vez de chamar toString() sobre ele. Isso evita obter um resultado inválido.

  • Codificação Base64: Se você planeja transmitir o array de bytes criptografados por meio de um meio textual, considere usar codificação Base64. Assegure-se de decodificá-lo corretamente durante a descriptografia.

  • Tratamento de Exceções: O código contém tratamento de exceções para gerenciar vários erros de criptografia, tornando-o robusto.

Agora você tem uma abordagem clara e eficaz para usar criptografia e descriptografia 3DES em suas aplicações Java. Ao seguir a explicação e os trechos de código acima, você pode implementar esse poderoso método de criptografia com sucesso.