Dúvida usando javax.crypto e SecretKeySpec

Pessoal, to usando o seguinte código como exemplo que estou montando pra encriptografar uma string:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;


 public class Teste1 {

    public static void main(String[] args){

    try{
        String str = "Testa";
        Cipher c = Cipher.getInstance("DES");

        byte[] desKeyData = ("UrsoPola").getBytes();
        SecretKeySpec chave = new SecretKeySpec(desKeyData, "DES");

        c.init(Cipher.ENCRYPT_MODE, chave);
        String str2 = new String(c.doFinal(str.getBytes()));
        System.out.println(str2);

        c.init(Cipher.DECRYPT_MODE, chave);

        str2 = new String(c.doFinal(str2.getBytes()));
        System.out.println(str2);

        }catch(Exception e){
            System.out.println(e.toString());
        }

  }
}

Estou fazendo alguma coisa de muito errado?

Aparentemente esta funcionando corretamente. (Fora o erro estranho que esta dando) :?

Se eu uso a chave Teste ele dá o seguinte erro:

Mas se eu mudo pra Testa por exemplo, ele nao dá mais o erro:

O que será que to fazendo de errado? Tô com sono, deve ser por isso :slight_smile:

Amanha testo denovo, valeu!

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).

thingol, valeu mesmo!
Por todas as observações!

Não sei se estou no local correto mas vou aproveitar o tópico.

Gostaria de decifrar pacotes que coleto da rede wireless, estou pegando os pacotes com Jpcap e wincap porém o AP usa criptografia AES com a chave que eu conheço.

Queria saber como eu faria para decifrar esses pacotes, seria mais ou menos como o discutido acima ?

Valeu