SHA1whithRSA

4 respostas
O

Boas,

O meu primeiro post!

O estado obrigou as empresas portuguesas terem os documentos com a assinatura criptada.
Usando o RSA.
Geramos a chave privada:
C:\openssl genrsa -out ChavePrivada.pem 1024

E depois geramos a chave publica:
C.\openssl rsa -in ChavePrivada.pem -out ChavePublica.pem -outform PEM -pubout

Eu renomei-o o ficheiro ChavePublica.pem para ChavePublica.txt porque o estado quer em TXT.
O estado portugues tem uma aplicação que verifica se as assinaturas dos documentos estão correctos.
Chamo a aplicação de validação dos documentos criado pelo estado e indico o caminho da chave publica TXT e
valida todas as assinaturas muito rapido.

Estou a tentar a criar um validador em java e que eu internamente
digo que a chave publica está em ‘C:\Chavepublica.txt’ e com ela validar os documentos assinados.

Mas estou a ter imensas dificuldades por isso se alguém ajudar fico feliz!

Apenas pretendo fazer verificação da assinatura de um documento.

Obrigado

4 Respostas

E

Para usar uma chave privada ou pública em formato PEM, você precisa usar o pacote BouncyCastle:

http://www.bouncycastle.org/

O

Boas,

Eu fiz isto:
import java.io.File;
import java.io.IOException;
import java.security.PublicKey;
import java.io.FileInputStream;
import java.security.Signature;
import java.io.DataInputStream;
import java.security.PrivateKey;
import java.security.KeyFactory;
import java.security.SignatureException;
import java.security.InvalidKeyException;
import java.security.spec.X509EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.NoSuchAlgorithmException;
//import java.security.spec.InvalidKeySpecException;


public class NovoVer 
{
  public static String verifySignature( String name ) throws Exception 
  {   
      File f = new File("d:/Chave_Publica.txt");
      FileInputStream fis;
      fis = new FileInputStream("d:/Chave_Publica.txt");
      DataInputStream dis = new DataInputStream(fis);
      byte[] keyBytes = new byte[(int)f.length()];
      dis.readFully(keyBytes);
      dis.close();

      //nao sei se é o correcto....
      X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes);
      
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      // se tenho a chave porque tenho de gerar outra vez?!!!
      PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

      Signature sig = Signature.getInstance("SHA1withDSA");

      //dá erro porque diz que a chave é invalida....
      sig.initVerify(pubKey);

      // name é a variavel que tem a assinatura do documento
     // name="K3gO6WPSuh9lhkVPH/2VE/J+GB4Hr+nItYk0MQn4OcJUjgF8ytbfgV+pnaFJBK4UYWEkeR8voycVhLyvc9yBq3nBq3yGwiYbXhwwMw5jtTx/gBVqJWVWedfvt2JySta/mgdA7DRIZRjQIHDmgFXf7E22ZrIwdeX3VtX+MEnxcmM="
      byte[] data = name.getBytes();

      sig.update(data);
      //return sig.verify(signature);
     
    //nao chega aqui...   
    if (sig.verify(sig.sign())) {return "Ok";}
      else {return "Falhou"; }       
                      
   }  
}
E

Como você deve ter descoberto,

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes);

não é apropriada para ler um arquivo de chave pública e privada em formato PEM. Você tem de baixar o pacote BouncyCastle, que dá suporte a esse formato.

O

entanglement:
Como você deve ter descoberto,

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(keyBytes);

não é apropriada para ler um arquivo de chave pública e privada em formato PEM. Você tem de baixar o pacote BouncyCastle, que dá suporte a esse formato.

Obrigado, mas gostava de ter uma solução sem ter de adicionar o pacote.

Criado 4 de novembro de 2011
Ultima resposta 4 de nov. de 2011
Respostas 4
Participantes 2