Pessoal,
estou com o seguinte problema e gostaria de saber se alguém já passou por isso e teve alguma solução.
Preciso zipar e criptografar um arquivo e enviá-lo por http e tb preciso fazer o processo inverso.
Quando estou fazendo o processo inverso, não consigo deszipar o arquivo, ocorre o seguinte erro de IO: “erro in opening zip file”. Este erro só ocorre quando descriptografo um arquivo e tento deszipá-lo.
Quando tento deszipar um arquivo que não foi criptografado, o mesmo é deszipado normalmente.
Compare o arquivo original com o arquivo resultante do processo de criptografar e descriptografar.
Devem estar diferentes, até no tamanho.
Pelo que você informou, você usou DES e não deve ter especificado nenhuma opção especial, então provavelmente seu arquivo final deve ter entre 0 a 7 bytes a mais que o arquivo original.
Uma forma de fazer ficar com o mesmo tamanho é usar o modo CFB ou OFB, mas a criptografia fica 8 vezes mais lenta.
Thingol,
os arquivos estão do mesmo tamanho.
Eu utilizei as opções CBC e NOPADDING.
ex: Cipher.getInstance(“DES/CBC/NoPadding”)
O erro ocorre quando tento criar um novo ZipFile para extrair os arquivos.
Ou seja, sempre quando descriptografo um arquivo não consigo mais gerar um ZipFile.
a) Já conferiu se os arquivos estão exatamente iguais? (faça uma comparação binária. No Linux e no Unix existe o comando “cmp” se não me engano, e no Windows use o comando “fc” com a opção “/b” (binário).
b) DES/CBC/NoPadding tem esse problema de deixar o arquivo com alguns bytes a mais. Use DES/CBC/PKCS5Padding - o arquivo criptografado fica com 1 a 8 bytes a mais, mas quando o arquivo é decifrado, ele retorna ao tamanho original.
Thingol,
de fato o arquivo fica maior. Mas testei tb da forma como vc falou “DES/CBC/PKCS5Padding” e este tb ficou maior.
Mas isto interferiria na questão de deszipar o arquivo?? Pois como te falei, após descriptografar um arquivo não consigo mais gerar um ZipFile para extração.
Detalhe: Se eu for através do explorer consigo deszipar o arquivo normalmente, só não consigo fazer através da minha aplicação.
Faça o seguinte: use o comando “jar” (que simplesmente usa as APIs java.util.zip do Java. )
Veja se é possível lidar com esse arquivo que tem alguns bytes a mais.
Acho que o comando “jar” (jar tvf para listar o arquivo, jar xvf pra abrir o arquivo) não gosta de arquivos ligeiramente corrompidos, como o que você conseguiu montar.
Se o comando “jar” não conseguir desmontar o arquivo, então você precisa resolver o problema de o arquivo ficar com um tamanho maior que o original.
Para fazer esse tipo de transmissão adiciona mais duas “camadas” na entrada/saida, que vao ser um GZIPOutputStream e outra lá para fazer a criptografia. No livro Java in a Nutshell da OReilly tem uns exemplos que cobrem isso bem!
O que o kknd quis dizer é o seguinte: digamos que você tivesse só um arquivo. Você pode, usando GZipInputStream / GZipOutputStream e CipherInputStream / CipherOutputStream, gerar um arquivo já criptografado e comprimido (comprima primeiro, criptografe depois).