Socorro - OPENSSL

Estou com problemas ao utilizar o OPENSSL, preciso criptografar um arquivo e depois descriptografá-lo. Aparece a seguinte mensagem de erro:

----EXECUTANDO O OPENSSL…---------------

Loading ‘screen’ into random state - done
RSA operation error
740:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:./crypto/rsa/rsa_pk1.c:151:

Process exitValue: 1
-PROCESSO TERNINADO…----------------------------------

Abaixo contém o código que estou executando o comando:

  
             //Gera a chave privada
             this.comando = this.rt.exec(this.openssl+" genrsa -out c:\\chaveprivada.key 1024");
             this.execOpenssl();
             
             this.comando = this.rt.exec(this.openssl+" rsa -in c:\\chaveprivada.key -pubout -out c:\\chavepublica.key");
             this.execOpenssl();
             
             this.comando = this.rt.exec(this.openssl+" rsautl -in "+nomeArquivo+" -out c:\\textocifrado.bin -pubin -inkey c:\\chavepublica.key -encrypt");
             execOpenssl();

Amigo, se o arquivo tiver mais de 120 bytes mais ou menos, não é possível criptografá-lo com uma chave de 1024 bits (128 bytes).

Isso é esperado.

Em vez disso, é necessário usar a opção smime (obviamente você precisa ter um certificado, não somente uma chave privada).

Executei os comandos que você passou, e para um arquivo bem pequeno eles funcionam direitinho.

Eu criei um arquivo .txt e nele escrevi “EMULADOR” . O erro acima é correspondente a essa palavra, eu preciso apenas criptografar uma pavra de no máximo 23 dígitos…

a) Você viu o tamanho exato do arquivo de entrada?
b) Você já experimentou digitar os mesmos comandos em uma linha de comando, para ver se funcionam? Eu digitei seus comandos e parece que funcionaram. Por favor, confira se fiz exatamente os mesmos comandos.

C:\Temp\openssl>openssl genrsa -out chaveprivada.txt 1024
WARNING: can't open config file: c:/openssl/ssl/openssl.cnf
Loading 'screen' into random state - done
Generating RSA private key, 1024 bit long modulus
............++++++
........++++++
e is 65537 (0x10001)

C:\Temp\openssl>openssl rsa -in chaveprivada.txt -pubout -out chavepublica.txt
WARNING: can't open config file: c:/openssl/ssl/openssl.cnf
writing RSA key

C:\Temp\openssl>openssl rsautl -in teste.txt -out teste.cifrado.bin -pubin -inke
y chavepublica.txt -encrypt
WARNING: can't open config file: c:/openssl/ssl/openssl.cnf
Loading 'screen' into random state - done

C:\Temp\openssl>dir teste.*
 Volume in drive C is C
 Volume Serial Number is C0F8-417D

 Directory of C:\Temp\openssl

14/12/2009  14:12               128 teste.bin
14/12/2009  14:14               128 teste.cifrado.bin
14/12/2009  14:06                10 teste.txt

No arquivo teste.txt está apenas e tão somente a palavra-chave “EMULADOR”.

Vlw kra, seu comando está correto pois fiz toda a rotina e funcionou no prompt de comando, mas no java nem a pau, abaixo eu tenho o método que se comunica com o openssl ele pode conter algum erro:


 private void execOpenssl() throws Exception{
       rt = Runtime.getRuntime();
       System.out.println("----EXECUTANDO O OPENSSL...---------------");
       InputStream stderr = comando.getErrorStream();
       InputStreamReader isr = new InputStreamReader(stderr);
       BufferedReader br = new BufferedReader(isr);
       String line = null;
       System.out.println("<ERROR>");
       while ( (line = br.readLine()) != null)
           System.out.println(line);
       System.out.println("</ERROR>");
       int exitVal = comando.waitFor();
       System.out.println("Process exitValue: " + exitVal);
       System.out.println("-PROCESSO TERNINADO...----------------------------------");
   }

Essa eu não entendi o mesmo código funcionar no prompt mas não funcionar no JAVA?

Dica: “nomeArquivo” pode estar apontando para o arquivo errado (talvez um arquivo maior, que você usou para testar). Cuidado ao especificar comandos com a versão padrão do Runtime.exec (que aceita uma linha de comando gigante). Use a versão do Runtime.exec que aceita um array com o comando todo “quebrado” em partes, porque essa versão leva em conta a necessidade de pôr aspas em volta de nomes de arquivos com espaços, por exemplo.

Eu mandei executar pondo o nome do arquivo direto assim como mostra o exemplo abaixo:


             //Gera a chave privada SIMÈTRICA
             this.comando = this.rt.exec(this.openssl+" genrsa -out c:\\chaveprivada.key 1024");
             this.execOpenssl();
             
             this.comando = this.rt.exec(this.openssl+" rsa -in c:\\chaveprivada.key -pubout -out c:\\chavepublica.key");
             this.execOpenssl();
             
             this.comando = this.rt.exec(this.openssl+" rsautl -in c:\\numeroSerie.txt -out c:\\textocifrado.bin -pubin -inkey c:\\chavepublica.key -encrypt");
             execOpenssl();

mensagem de erro:

----EXECUTANDO O OPENSSL…---------------

Loading ‘screen’ into random state - done
RSA operation error
4080:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:./crypto/rsa/rsa_pk1.c:151:

Process exitValue: 1
-PROCESSO TERNINADO…----------------------------------

Não sei o que pode estar havendo…

Só para ser bem chatinho. Qual é o tamanho exato, em bytes, do arquivo “c:\numeroSerie.txt” ? Quero ver a saída do comando “dir”. (Assim como eu postei a saída do comando “dir” de meu teste).

Para fechar esse tópico como tutorial, apenas troquei o nome do arquivo a ser criptografado ao invés de numeroSerie.txt mudei para numero_serie.txt… Agora está funcionando corretamente.

Para não te contrariar abaixo tem o tamanho do arquivo:

Microsoft Windows [versão 6.0.6000]
Copyright (c) 2006 Microsoft Corporation. Todos os direitos reservados.

C:\Users\FISCAL>cd..

C:\Users>cd..

C:\>dir
 O volume na unidade C não tem nome.
 O Número de Série do Volume é 1440-60FD

 Pasta de C:\

14/12/2009  16:20             1.024 .rnd
18/09/2006  19:43                24 autoexec.bat
14/12/2009  16:20             5.471 BemaFI32-20091214.log
14/12/2009  16:20               887 chaveprivada.key
14/12/2009  16:20               272 chavepublica.key
14/12/2009  15:53                 0 comando.dat
18/09/2006  19:43                10 config.sys
24/08/2009  10:38    <DIR>          database
14/12/2009  16:20                 8 decifradotexto.txt
24/08/2009  10:38    <DIR>          DPEC
16/11/2009  16:08    <DIR>          mercurii_manager
18/11/2009  14:33    <DIR>          nfe
14/12/2009  15:55                 8 numero_serie.txt
14/12/2009  14:24    <DIR>          openssl
11/12/2009  09:42    <DIR>          Program Files
25/08/2009  17:35    <DIR>          retorno_nfe
08/10/2009  19:08    <DIR>          Temp
14/12/2009  16:20               128 textocifrado.bin
14/12/2009  10:25    <DIR>          Users
24/11/2009  14:19    <DIR>          Windows
              10 arquivo(s)          7.832 bytes
              10 pasta(s)   23.741.362.176 bytes disponíveis

C:\>

Muito obrigado pela ajuda!