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!