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
-
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;
-
Definição da Classe:
public class TripleDESTest {
-
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" }
-
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); }
-
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 chamartoString()
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.