Criptografia rsa em java

Não, não, não; você usa o cifra para cifrar, e ele lhe volta 2 arrays de bytes, que você envia para o destinatário de forma separada (por exemplo, como 2 arquivos, ou então como 2 blobs no banco de dados).

No outro lado, você usa o decifra para decifrar, e ele precisa desses 2 arrays de bytes, que você precisa pegar de algum lugar.

Se quiser pôr tudo em um array só, não tem problema, mas você tem de saber qual é o tamanho ocupado pela chave criptografada (que nesse caso é 128 bytes) e o tamanho ocupado pelos dados criptografados (que é igual ao tamanho dos dados originais, mais 1 a 16 bytes necessários para completar um múltiplo de 16).

thingol, agora deu certo… Obrigada pelas explicações e grande paciência… :thumbup:

Olá a todos,

Estou tentando criptografar alguns dados com RSA, mas gostaria de carregar a chave publica a partir de uma string. Mas não estou tendo sucesso em carregar uma String em um PublicKey, alguém tem alguma idéia de como fazer ?

Também gostaria de saber como eu configuro o valor do expoente.

Dica: arranje o livro “Beginning Cryptography with Java”, de David Hook, que lhe dará um monte de informações sobre o que você precisa. Ele tem todas as receitas de bolo.

Valeu pela dica, já peguei o livro.

thingol,

O Livro foi muito útil mesmo, esclareceu todas as dúvidas e funcionou como eu precisava.Obrigado!

Agora estou com o seguinte problema, a criptografia vai funcionar dentro de um applet e o uso do Bouncy Castle como provider me obriga a ter o jar dele instalado no diretório do JRE, teria como incorporar ele ao meu código para que o usuário não tivesse que colocar o arquivo no JRE dele?

Você pode usar algumas rotinas do BouncyCastle sem que ele seja provider, mas é questão de testar. Não sei o que você está usando em seu programa; de qualquer maneira, veja (talvez no livro) como é que se adiciona dinamicamente um provider em tempo de execução, sem que seja necessário modificar o arquivo java.security.

thingol,

Parabéns pelo belo exemplo, realmente foi de muita valia para o meu entendimento sobre criptografia utilizando RSA e Java. Funcionou 100%.

Percebo por suas explicações claras e coesas sobre este assunto que talvez possa me orientar na resolução de um problema que estou enfrentando.

Recebi de um cliente atendido por nossa empresa o seguinte cenário:

[list]Um arquivo chamado “chave_publica.pem”[/list]
[list]Um arquivo chamado “chave_privada.der”[/list]
[list] A especificação para construir um cliente java que criptografa um número de cartão de crédito utilizando a chave pública (chave_publica.pem) fornecida por eles e um servidor java que receberá a String criptografada e decriptografe utilizando a chave privada (chave_privada.der).
[/list]

Este sistema já existia anteriormente, porém era desenvolvido em ASP, utilizava uma DLL do OpenSSL para realizar criptografia e decriptografia. A necessidade de portar este sistema para Java tem sido um grande desafio pra mim, estou a três dias tentando encontrar uma orientação concreta mas estou perdendo o fio da meada em algum momento.

É realmente possível fazer o que me foi solicitado? Se sim pode me orientar? Qualquer ajuda será de enorme valia.

Agradeço desde já pela atenção,


Conteúdo da chave_publica.pem

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv4Lvd+7YZxMDTw5cKCLe
uLebDQcPNVRukzh4R4gh+fArX2CiU79Sv2XtCXBFEI4YdVe3OKRki4bXFgcZ/vFK
AMf4ly9+maHlA/4NggRj/ZpI8wYY6Plc5JZkPaLqiwiYehFLKqRG490xyxO7T194
hKJb0pGvCVNuB3akIOP9fOwc/SRnFpQG3YiflqBaj2G0oclxkUHt2co3+JA6wEgv
0fcxBc7B45+VwXjx06oJlzxpAIchtJL5xE8d3sOoA/d9EvuVsr+ffFddgyqkemyi
kUE2CGt4dOxGh4a/0zX9Mrsul2V1Nt3K0uibptAhuouxMj3IuSdUCQBeaUrq4Nrw
YwIDAQAB
-----END PUBLIC KEY-----

Obs.: Por questões legais não posso publicar a chave privada, mas entenda como sendo um par desta chave pública em formato .DER

Se não me engano, o BouncyCastle tem algumas rotinas que permitem entender o formato PEM tanto para chaves privadas quanto públicas.
O formato PEM do OpenSSL é mais antigo que os padrões PKCS#9 (chave pública) e PKCS#12 (chave privada), se não me engano, portanto é necessário ter código especial para usá-lo.
Dê uma procuradinha na documentação do BouncyCastle. Ele deve ter até umas classes “OpenSSL” ou coisa parecida.
De qualquer maneira, se esse cliente Java puder chamar um programa externo (como o OpenSSL.exe) e não tiver problemas de desempenho (do tipo “eu preciso decifrar 1000 números de cartões por segundo”) você pode chamar o openssl.exe com um monte de parâmetros adequados, e obter um arquivo com os dados decifrados.

Olá Pessoal!!
Implementei um Web Service que faz encriptação e assinatura digital, separadamente.
Porém, eu preciso assinar uma mensagem e depois encriptar essa mesma mensagem que foi assinada digitalmente, garanntindo assim a confidencialidade, autenticidade e não-repúdio.
Está dando o seguinte erro, quando analiso o log do servidor e não estou sabendo como resolver.

12/02/2009 17:00:08 com.sun.xml.ws.server.sei.EndpointMethodHandler invoke
INFO: Data must not be longer than 53 bytes
javax.crypto.IllegalBlockSizeException: Data must not be longer than 53 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*…)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*…)
at javax.crypto.Cipher.doFinal(DashoA13*…)
at SecurityServices.INCA.codifica(INCA.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.xml.ws.api.server.InstanceResolver$1.invoke(InstanceResolver.java:246)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
at com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:598)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:557)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:542)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:439)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:444)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:129)
at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:160)
at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

Alguém podería me ajudar?
Desde já agradeço pela ajuda.

Dá a impressão que você está tentando chamar o RSA diretamente sobre os dados, em vez de fazê-lo sobre um hash dos dados.

Obrigado pela dica thingol…
Uma outra dúvida pessoal…
Estou executando alguns código do livro Beginning Cryptography, mas tem dado o seguinte problema:

Exception in thread “main” java.security.NoSuchProviderException: no such provider: BC
at sun.security.jca.GetInstance.getService(GetInstance.java:66)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:190)
at java.security.KeyPairGenerator.getInstance(KeyPairGenerator.java:237)
at chapter6.Utils.generateRSAKeyPair(Utils.java:15)
at chapter6.X509V1CreateExample.main(X509V1CreateExample.java:34)

Estou começando a trabalhar agora com a Bouncy Castle e não estou conseguindo resolver o problema.
Vlw!

no lugar de BC troque por new BouncyCastleProvider()

Você não seguiu adequadamente as instruções do livro. Para que haja um provider “BC”, você precisa copiar alguns dos JARs do BouncyCastle para o diretório jre/lib/ext e alterar um arquivo java.security (resumidamente).

exato…

security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider 

Olá pessoal!
Estou fazendo uma assinatura em um arquivo pdf, mas na hora de verificar a mesma está dando os seguintes erros…

java.security.cert.CertificateException: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
at sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:419)
at java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:427)
at chapter16.SignedPdfMODIFICADO.main(SignedPdfMODIFICADO.java:148)
Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
at sun.security.util.DerInputStream.getLength(DerInputStream.java:544)
at sun.security.util.DerValue.init(DerValue.java:346)
at sun.security.util.DerValue.(DerValue.java:302)
at sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.java:532)
at sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:417)
… 2 more

o meu trecho do código é o seguinte:
System.out.println("-----> Começa o processo de verificação da assinatura."); CertificateFactory cf = CertificateFactory.getInstance("X509"); //Collection col = cf.generateCertificates(new FileInputStream("/home/thiago/iText/exemplos/chapter16/foobar.cer")); Collection col = cf.generateCertificates(new FileInputStream("/home/thiago/certificados/guj.jks")); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(null, null); for (Iterator it = col.iterator(); it.hasNext();) { X509Certificate cert = (X509Certificate) it.next(); System.out.println(cert.getIssuerDN().getName()); ks.setCertificateEntry(cert.getSerialNumber().toString(Character.MAX_RADIX), cert); } reader = new PdfReader("/home/thiago/iText/exemplos/chapter16/signed_messageTESTE.pdf"); AcroFields af = reader.getAcroFields(); ArrayList names = af.getSignatureNames(); String name;

Obrigado!
Abraço a todos…