Primeiro não é “encriptografar”, há duas palavras em português para “encrypt”: “criptografar” ou “cifrar”.
Para “decrypt” há a palavra “decifrar”. Alguns dizem que existe “descriptografar” mas acho muito comprido.
Depois tem um monte de probleminhas.
000 import javax.crypto.Cipher;
001 import javax.crypto.spec.SecretKeySpec;
002
003
004 public class Teste1 {
005
006 public static void main(String[] args){
007
008 try{
009 String str = "Testa";
010 Cipher c = Cipher.getInstance("DES");
011
012 byte[] desKeyData = ("UrsoPola").getBytes();
013 SecretKeySpec chave = new SecretKeySpec(desKeyData, "DES");
014
015 c.init(Cipher.ENCRYPT_MODE, chave);
016 String str2 = new String(c.doFinal(str.getBytes()));
017 System.out.println(str2);
018
019 c.init(Cipher.DECRYPT_MODE, chave);
020
021 str2 = new String(c.doFinal(str2.getBytes()));
022 System.out.println(str2);
023
024 } catch(Exception e){
025 e.printStackTrace();
026 }
027
028 }
029 }
Linha 012 - Se você usar isso, tem dois problemas: a senha tem de ter exatamente 8 bytes - se usar um acento, por exemplo, getBytes() vai retornar 2 bytes para cada caracter acentuado (mas se usar getBytes(“ISO-8859-1”) retorna 1 byte só, e é compatível com Windows). Além
disso, chaves obtidas diretamente com senhas são muito fracas (estude um pouco a classe MessageDigest). A idéia é que você acha o MessageDigest da senha (que retorna 16 ou 20 bytes) e usa os primeiros 8 bytes para a chave. O MessageDigest é uma seqüência de dados que parece aleatória, por isso pode ser usada para fornecer chaves muito mais fortes.
Linha 013 - Se você usar isso, o problema é que sua mensagem deve ter exatamente um múltiplo de 8 bytes, senão dá problemas de “padding”. Em vez de usar “DES”, use “DES/ECB/PKCS5Padding”. Isso completa os bytes necessários para evitar o problema.
Linha 016 e 021 - É isso que ocasiona seus problemas. new String(byte[]) é uma conversão “destrutiva” porque converte algumas seqüências de bytes para o caracter ‘?’.
Não há jeito de consertar isso (não adianta passar o parâmetro “encoding” porque não há nenhum “encoding” que resolva esse problema).
Então quando você vai desconverter a String resultante para um byte[] você não vai ter o mesmo byte[] original.
Em vez disso, procure como converter um byte[] para uma String usando Base-64 ou hexadecimal. É relativamente fácil fazer isso, tem muita coisa pronta, é só procurar (não faça você mesmo o conversor Base-64, porque sempre dá um probleminha, e você vai acabar levando muito tempo).