Você está na página 1de 4

Usando criptografia em JAVA

Usar criptografia em Java no uma tarefa difcil. Com algumas pesquisas no Google, encontramos diversos resultados que podem nos atender. Recentemente, tive que usar em um projeto um esquema de criptografia onde informaes seriam criptografas e descriptografadas a quase todo momento. Assim, resolvemos criar um classe de criptografia e um exceo que representasse qualquer erro ocorrido na criptografia e descriptografia. A forma de criptografia que escolhemos, foi a AES. Esse tipo de criptografia uma das mais seguras j desenvolvidas. Se quiser mais informaes sobre esse a AES, de uma olhada aqui. Para uma criptografia AES voc precisar de uma chave. Essa chave ser usada por quem quer criptografar e quem quer descriptografar. Portanto, ela dever ficar com quem somente tem autorizao para fazer tais tarefas de criptografia ou descriptografia. Em Java, essa chave representada por um array de bytes, como abaixo: 1107, 48, 10, -1, -37, -90, 70, -36};
public static final byte[] CHAVE = {85, 10, 0, -25, 68, 88, 46, 37,

Em nossa classe de criptografia, haver um mtodo para criptografar informaes onde esse mtodo receber como parmetros a informao a ser criptografada, que ser uma String e tambm receber a chave de criptografia, que eu mostrei acima. Haver em nossa classe tambm o mtodo de descriptografia onde ele ir receber tambm dois parmetros. A chave de criptografia (acima) e a informao criptografada, que uma String. Sendo assim, nossa classe de criptografia ficar da seguinte forma: 01import javax.crypto.Cipher; 02import javax.crypto.spec.SecretKeySpec; 03import sun.misc.BASE64Decoder; 04import sun.misc.BASE64Encoder; 05 06public class Encrypter { 07 08 private static final String METODO_ENCRIPTACAO = "AES"; 09 public static final byte[] CHAVE = {85, 10, 0, -25, 68, 88, 46, 37, 107, 48, 10, -1, -37, -90, 70, -36};; 10 11 public static String encriptar(byte[] key, String value) 12 throws EncryptorException { 13 try { 14 SecretKeySpec skeySpec = new SecretKeySpec(key, 15 METODO_ENCRIPTACAO); 16 17 Cipher cipher = Cipher.getInstance(METODO_ENCRIPTACAO); 18 cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 19 byte[] encrypted = cipher.doFinal(value.getBytes());

20 return new BASE64Encoder().encode(encrypted); 21 } 22 catch (Exception e) { 23 throw new EncryptorException("Erro ao criptografar informaes 24" + e.getMessage()); } 25 } 26 27 28 public static String decriptar(byte[] key, String encrypted) throws EncryptorException { 29 30 byte[] decrypted = null; 31 32 try { SecretKeySpec skeySpec = new SecretKeySpec(key, 33 METODO_ENCRIPTACAO); 34 35 byte[] decoded = new BASE64Decoder().decodeBuffer(encrypted); 36 37 Cipher cipher = Cipher.getInstance(METODO_ENCRIPTACAO); 38 cipher.init(Cipher.DECRYPT_MODE, skeySpec); decrypted = cipher.doFinal(decoded); 39 } 40 catch (Exception e) { 41 throw new EncryptorException("Erro ao descriptografar 42informaes " + e.getMessage()); 43 } 44 return new String(decrypted); 45 } 46 } 47 48 49 Voc deve estar se perguntando, mas o que acontece se eu chamar o mtodo de descriptografia e enviar uma informao no criptografada? A resposta simples: vai dar erro e ser lanada uma exceo. Repare no cdigo que as Exception so capturadas e j lanada a EcryptorException. Essa exceo criada somente para representar erros que possam ocorrer nessa classe de criptografia. A classe de Exceo assim: 1public class EncryptorException extends Exception { 2 3 private static final long serialVersionUID = -1295447857016462572L; 4 5 public EncryptorException(String mensagem) { super(mensagem); 6 } 7 } 8

Nenhum segredo tambm. Agora basta testar a sua classe chamando os mtodos de criptografia e descriptografia. Vamos fazer o teste. Segue meu exemplo onde eu criptografo uma String e a String criptografada retornada usada como parmetro na chamada da descriptografia. Veja s o exemplo: 01public class Main { 02 /** 03 * @param args 04 */ 05 public static void main(String[] args) { 06 String informacao = "Lynyrd Skynyrd"; 07 String informacaoCriptografada = null; 08 String informacaoDescriptografada = null; 09 10 try { 11 informacaoCriptografada = Encrypter.encriptar(Encrypter.CHAVE, 12informacao); System.out.println("Informao criptografada: " + 13 informacaoCriptografada); 14 15 informacaoDescriptografada = 16Encrypter.decriptar(Encrypter.CHAVE, informacaoCriptografada); 17 System.out.println("Informao descriptografada: " + informacaoDescriptografada); 18 } catch (EncryptorException e) { 19 e.printStackTrace(); 20 } 21} Se voc usou o exemplo da minha classe de criptografia sem mudar a chave e executou o teste acima tambm sem mudar a informao a ser criptografada, voc ter uma sada para console que ser a seguinte: Informao criptografada: Ng7uAaxZKEReAxrdwn2GEw== Informao descriptografada: Lynyrd Skynyrd Se voc conseguiu chegar no resultado acima, quer dizer que tudo deu certo! Ainda existe mais alguns detalhes sobre a chave de criptografia onde explico um pouco mais abaixo. SOBRE A CHAVE DE CRIPTOGRAFIA A chave de criptografia nica, portanto voc no ir querer usar a chave que coloquei no meu exemplo. Voc ir querer ter sua prpria chave de criptografia. Para fazer isso, criei um mtodo onde ele devolve as chaves de criptografia prontas em array de bytes. O mtodo no difcil de entender. J existe um gerador de chaves nativos do Java chamado KeyGenerator. Ao chama-lo, ele devolve um array de bytes. O mtodo que

criei apenas obtm esse array de bytes e percorre o array exibindo cada byte para console. No final, voc ter seus bytes em console para usar em cdigo. basta copiar e colar. Segue o mtodo que gera a chave: 01 02public static void gerarChave() { try { 03 KeyGenerator keyGen = 04KeyGenerator.getInstance(METODO_ENCRIPTACAO); 05 System.out.println("Chave AES:"); 06 byte[] chave = keyGen.generateKey().getEncoded(); 07 08 System.out.print("{"); 09 for (byte b : chave) { 10 System.out.print("" + b + ", "); 11 } System.out.println("}"); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 } 16 Certo pessoal? Ento isso! At a prxima.

Você também pode gostar