Criptografia Triple DES em Java

Um dos posts que mais foram acessados e comentados em meu blog foi um escrito sobre Criptografia em Java utilizando Hashs criptográficos.

Depois de receber alguns pedidos resolvi escrever este novo post utilizando no exemplo uma criptografia do tipo Triple DES, com esta criptografia podemos encriptografar e descriptografar informações utilizando Java.

Triple DES é a mais segura versão do algoritmo original Data Encryption Standard (DES) e você pode saber sobre este algoritmo aqui.

Agora vamos a implementação do algoritmo, eu criei uma classe simples que fornece dois métodos de instância para encriptografar e descriptografar uma String.

package br.com.rodrigolazoti;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * Class that supplies a criptography of triple type DES.
 * @author Rodrigo Lazoti
 * @since 05/07/2009
 */
public class CryptographyTripleDES {
 private Cipher cipher;
 private byte[] encryptKey;
 private KeySpec keySpec;
 private SecretKeyFactory secretKeyFactory;
 private SecretKey secretKey;

 /**
 * Method that create a new instance of class.
 * @return
 * @throws InvalidKeyException
 * @throws UnsupportedEncodingException
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeySpecException
 */
 public static CryptographyTripleDES newInstance() throws InvalidKeyException, UnsupportedEncodingException,
 NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException {
 return new CryptographyTripleDES();
 }

 /**
 * Default Constructor.
 * @throws UnsupportedEncodingException
 * @throws NoSuchAlgorithmException
 * @throws NoSuchPaddingException
 * @throws InvalidKeyException
 * @throws InvalidKeySpecException
 */
 private CryptographyTripleDES() throws UnsupportedEncodingException, NoSuchAlgorithmException,
 NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException {
 String key = "http://www.rodrigolazoti.com.br";
 encryptKey = key.getBytes( "UTF-8" );
 cipher = Cipher.getInstance( "DESede" );
 keySpec = new DESedeKeySpec( encryptKey );
 secretKeyFactory = SecretKeyFactory.getInstance( "DESede" );
 secretKey = secretKeyFactory.generateSecret( keySpec );
 }

 /**
 * Method that encrypts a value.
 * @param value
 * @return
 * @throws InvalidKeyException
 * @throws IllegalBlockSizeException
 * @throws BadPaddingException
 * @throws UnsupportedEncodingException
 */
 public String encrypt( String value ) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
 UnsupportedEncodingException {
 cipher.init( Cipher.ENCRYPT_MODE, secretKey );
 byte[] cipherText = cipher.doFinal( value.getBytes( "UTF-8" ) );
 BASE64Encoder encoder = new BASE64Encoder();
 return encoder.encode( cipherText );
 }

 /**
 * Methot that decrypts a value.
 * @param value
 * @return
 * @throws InvalidKeyException
 * @throws IllegalBlockSizeException
 * @throws BadPaddingException
 * @throws IOException
 */
 public String decrypt( String value ) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
 IOException {
 cipher.init( Cipher.DECRYPT_MODE, secretKey );
 BASE64Decoder dec = new BASE64Decoder();
 byte[] decipherText = cipher.doFinal( dec.decodeBuffer( value ) );
 return new String( decipherText );
 }

}

A seguir criei uma pequena classe para realizar um teste:

package br.com.rodrigolazoti;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

public class TestCryptographyTripleDES {

 public static void main( String[] args ) throws InvalidKeyException, NoSuchAlgorithmException,
 NoSuchPaddingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, IOException {

 CryptographyTripleDES cryptography = CryptographyTripleDES.newInstance();
 String value = "Rodrigo Lazoti";
 System.out.println( "Valor utilizado => " + value );
 String encryptedValue = cryptography.encrypt( value );
 System.out.println( "Valor criptografado => " + encryptedValue );
 String decryptedValue = cryptography.decrypt( encryptedValue );
 System.out.println( "Valor descriptografado => " + decryptedValue );

 }

}

O resultado do teste é:

Valor utilizado => Rodrigo Lazoti
Valor criptografado => RgYlMeQBUcyx6419bKlqRw==
Valor descriptografado => Rodrigo Lazoti

Com isso já temos uma boa base de como utilizar este tipo de criptografia em aplicações Java.

Atualizei o IPhone para a versão 3.0

Ontem vi a noticia da liberação de uma nova versao do sistema operacional do iphone e assim que cheguei em casa coloquei o iphone para atualizar.

O Download demorou um pouco, afinal a atualizacao tem cerca de 230mb. Depois disso foi mais uns 10 minutos aguardando o iphone atualizar-se.

Depois de tudo pronto, o iphone reinicia e começo a procurar novidades no meu gadget.

IMG_0169

Meu iphone estava com jailbreak e a primeira mudança que notei foi que todos os aplicativos que instalei via Cydia/Installer foram perdidos ( os únicos que sentirei falta serão o Sycoder para filmar e um outro que funcionava como um terminal Unix  :( ).

Mas não tem problema, afinal eu já sabia que iria perder tudo que instalei com o jailbreak.

A primeira coisa que “estranhei” foi que os icones ficaram todos bagunçados, mas nada que uma rapida organizada nao resolva.

Depois disso vi uma pequena lupa abaixo dos aplicativos, trata-se de um Spotlight ( recurso já existente no Mac OS X ) para o iphone. Um recurso bem legal onde podemos pesquisar qualquer coisa (Aplicativos, Contatos, Musicas e etc) dentro do iphone.

IMG_0168

Em seguida abri a camera com esperança de poder filmar com software nativo do iphone, mas infelizmente isso não foi possivel.

Testei o novo Voice Memos e funciona muito bem, agora posso gravar audio! :D

Testei tambem o Copiar/Colar ( Copy/Paste ) e foi bem fácil de utiliza-lo nas mensagens assim como o envio de fotos nas mensagens tambem é possivel.

Em geral nao percebi mudanças de performance na atualização, mas uma coisa que notei que melhorou bastante foi o GPS, agora meu iphone está apontando sua localizacao no Google Maps bem mais rápido do que antes e parece estar mais preciso tambem, mas ainda preciso testar mais este recurso.

Senti falta do Voice Control, a apple poderia ter incluso este recurso na atualizacao! :(

Aproveitei e também já baixei e instalei o novo SDK 3 do iphone e esse sim demorou bem mais para baixar e atualizar, pois ele tem 2.1gb.

Fui no Falando em Java 2009

Dia 24/05/2009 passei praticamente o dia todo (domingo) assistindo as palestras do evento Falando em Java 2009 realizado pelo pessoal da Caelum.

O evento comecou com um apresentação sobre a evolução da Caelum, de seu ambiente de trabalho (Deu vontade de enviar meu curriculo! :D ) e das novidades para os cursos. 

img_0138

Depois comecaram as palestras mais tecnicas e a primeira foi otima! Realizada pelo Jim Webber sobre SOA, onde ele apresenta seu ponto de vista sobre esta tecnologia e como esta é vendida pelas “grandes” empresas do mercado.

Em seguida Paulo Silveira e o Rafael Cosentino apresentaram algumas ideias de porque adotar determinada solução para um tipo de caso e não para outro, foi muito boa tambem( embora eu particularmente pensei que iria ver outro tipo de assunto nessa palestra, acho que o titulo não bateu muito com o conteudo da palestra).

Antes de uma parada para o lanche (muito bom por sinal tirando o problema do tumulto! :D ), Alessandro Lazarotti e Ricardo Nakamura fizeram uma divertida e otima palestra sobre JBoss Seam e WebBeans e mostrar alguns exemplos de utilizacao do Seam. Faz um tempo que nao utilizo o Seam, mas parece que ele esta bem melhor do que quando utilizei.

img_0145Depois de tomo mundo detonar o lanche, Felipe Sabella e Guilherme Silveira palestraram sobre o VRaptor 3 e sinceramente eu me impressionei com o potencial deste framework. Ja baixei a a versao beta para alguns testes aqui! Recomendo ficarem atento a este framework, pois ele esta muito bom.

Logo depois Guilherme Moreira e Sergio Lopes apresentaram sobre Arquitetura e o JBoss rodando em Cluster nao colaborou muito, mas as dicas de Hibernate que eles deram ja valeram e muito a palestra.

O Anderson Leite e Fabio Kung fizeram uma exploracao dentro da JVM, mostrando novas funcionalidades e como algumas coisas funcionam por dentro, foi bem legal pena ter pouco tempo para falar sobre Java FX e Java TV.

Infelizmente Bill Burke nao conpareceu no evento, mas o Jim realizou a palestra e mais uma vez ele foi sensacional falando e explicando sobre REST!

img_0141

Uma novidade que vi no evento e que me deixou contente foi o anuncio de um livro escrito pelo pessoal da Caelum sobre arquitetura de software, pena que so sera lançado em novembro. Agora é aguardar! :(

Foi muito bom participar do evento, encontrar o pessoal do GUJ e outras pessoas com quem ja trabalhei e estudei.

Em resumo o evento foi muito bom, so nao gostei do gerador em ruby que nao sorteou meu numero e assim nao ganhei o Wii sorteado.. :(