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).
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.
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.
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.
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!
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).
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;