Problema com Criptografia

9 respostas
orobsonpires

Pessoal,

Estou utilizando uma classe teste para criptografia, essa classe a partir de uma entrada gera esses dados criptografados e depois faz o caminho inverso. O problema é na hora da descriptografia dos dados, pois a mesma está gerando uma saída diferente da entrada inicial. Não sei se estou fazendo algo de errado, alguém poderia dá uma olhada no código?

9 Respostas

E

Toda vez que você converte um array de bytes para string, ele é corrompido. Portanto, evite trafegar arrays de bytes como strings dentro do seu programa.

Experimente fazer o seguinte: crie um array de bytes de 256 bytes com os bytes de -128 até +127, e os converta para uma String. A seguir, pegue a string, e reconverta para bytes.

Você vai perceber que vários desses bytes foram alterados para o caracter ‘?’.

orobsonpires

entanglement,

Estou trafegando os bytes entre a mesma máquina, acho que não vai gerar perda de dados , creio que não seja isso que esteja gerando essa inconsistência.

mauricioadl

entanglement:
Toda vez que você converte um array de bytes para string, ele é corrompido. Portanto, evite trafegar arrays de bytes como strings dentro do seu programa.

Experimente fazer o seguinte: crie um array de bytes de 256 bytes com os bytes de -128 até +127, e os converta para uma String. A seguir, pegue a string, e reconverta para bytes.

Você vai perceber que vários desses bytes foram alterados para o caracter ‘?’.

entanglement, sabe dizer porque isso acontece?

E

No seu código:

int J_DDecrypt(byte[] arg0, byte[] arg1, int arg2, int arg3, byte[] arg4, int[] arg5){  
        try {  
...              
            byte[] clearText = new String(arg4).trim().getBytes();

Veja que isto está corrompendo os bytes. Digamos que arg4 seja um array de bytes contendo os bytes de -128 a +127. Isso cria uma String - aqui já os bytes serão corrompidos - a seguir você faz um trim - e depois você pega os bytes de novo. Se você copiasse arg4 diretamente para clearText você não teria os bytes corretos?

E

mauricioadl:
entanglement:
Toda vez que você converte um array de bytes para string, ele é corrompido. Portanto, evite trafegar arrays de bytes como strings dentro do seu programa.

Experimente fazer o seguinte: crie um array de bytes de 256 bytes com os bytes de -128 até +127, e os converta para uma String. A seguir, pegue a string, e reconverta para bytes.

Você vai perceber que vários desses bytes foram alterados para o caracter ‘?’.

entanglement, sabe dizer porque isso acontece?

O Java e o C# são assim. Isso é devido à implementação da codificação de strings Unicode como bytes. Então não use strings dentro de suas rotinas de criptografia. Se em alguma parte você precisa converter bytes para strings, use uma codificação como Base-64.

orobsonpires
Tentei passar arg4 diretamente mas deu a seguinte exception:

javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes

at com.sun.crypto.provider.RSACipher.a(DashoA13*)

at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*)

at javax.crypto.Cipher.doFinal(DashoA13*)

at br.com.trueaccess.TacNDJavaLib.J_DDecrypt(TacNDJavaLib.java:73)

at br.com.trueaccess.TacNDJavaLib.main(TacNDJavaLib.java:163)
E

Pois é, criptografia RSA tem o seguinte problema: uma chave de X bits não consegue criptografar algo que tenha mais de X bits de tamanho.

Normalmente, você cria uma chave AES (que tem no máximo 256 bits), criptografa seus dados, e então a criptografa com RSA.

Para decifrar os dados, você descriptografa a chave que você criptografou com RSA, resultando uma chave AES de 256 bits, e então decifra seus dados.

Você nunca, nunca, nunca deve tentar criptografar algo só com RSA.
Além de intrinsecamente inseguro, é intrinsecamente lento também.
Não estou mais encontrando aqui na Internet o artigo que diz que criptografar uma quantidade grande de dados (“known cleartext”) com uma única chave RSA é inseguro, mas eu sei que isso foi provado.

E

Você tem de revisar suas rotinas. Só dei um exemplo do que está intrinsecamente errado no seu código (tem mais coisa errada mas só mostrei esse ponto), e você tem de revisá-lo todo.

orobsonpires

entanglement,

A criptografia está funcionando normal, fiz uma verificação aqui e não está havendo a perda de dados na na hora da transformação de bytes para String, como você tinha dito… porém no processo inverso não está conseguindo descriptografar. Creio que pode ser um problema com minha chave.

Criado 28 de agosto de 2012
Ultima resposta 28 de ago. de 2012
Respostas 9
Participantes 3