Assinatura Digital (meu pesadelo) PAF-ECF

Delphi

22/07/2010

Boa tarde;

                Não estou conseguindo validar a assinatura do Teste 12.

Estou usando esses comandos:



Criei o Arquivo CHAVE.PEM uma única vez com o comando:

openssl genrsa -out CHAVE.PEM 1024

Que me retornou:
  -----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDPMzEzj05OQ86HPq4eHFAArbF+KoCREkExn2GNv21sQbrJgh4N
19TTyP0dUh6F3e7u6Um1KbojXq9sVoo8m4m2Q3qEdEpv6F7mPGHk7epY36B7hK5w
sz/BvKM0+4W8jSsK5wXbWZRZTSliOJSXvCignkB6wWh3ARwdZFliyx2EnQIDAQAB
AoGAWTkFHdu+74rZW3nNRqAQf0pMXTT2KgI/Wpv0STK+btibE3zZbkKbnhs1i7O5
+xFHe0+v8rgmNGboiXF2k4SytqgO5yod8Nz1TDRCj5B1soifrP50dnhlELbdMvwb
xWMvXf6VAfVKrJKPzdAyyCRd5CU3LYXFMQfpxWdbwTybG0ECQQDzWIpQZTVNX3l7
1WHi0GF3N296PZNyS8CijuwHjeinOHEubIAACzrQtKbDinPfnDx7EmaiTAx5EZVk
8wP0V8UtAkEA2fl4z6P/aEdlC6uL16D0tfVo+9T+VoBog844TfBk1IPSFM7x5xiQ
a0WH9aonbNg45M2XCdUZhiyb7RDAIk5DMQJBALAZ/AZQJ7G1jRG7itn8GPyQRoE8
/G4zOdWp/k89OAeDhgylgkAF4GtWwHQzxsUkqHQcDeAXjtMykV17q/nwZoUCQQCx
3Px0yohtqdxNAoUQxZkJJSCuZaXIJe2ip9KP3noYYxw4uIjxnryxm8IOdvLGwUTj
htMZRdcXAi2V6xYsqBnxAkB49wUy4pQfBWRtCNRlRs6ojI7nLnwG/b0Qj7SJMRd9
ZmBgzYIwJTaLD4z/Xx9BAuNbJDqeavSFxnlPcmuyCMrA
-----END RSA PRIVATE KEY-----

Depois criei o arquivo pra ficar dentro do XML essa também uma única vez:

                               openssl rsa -in chave.pem -modulus -out PUBLICA.PEM

Que me retornou:
Modulus=CF3331338F4E4E43CE873EAE1E1C5000ADB17E2A80911241319F618DBF6D6C41BAC9821E0DD7D4D3C8FD1D521E85DDEEEEE949B529BA235EAF6C568A3C9B89B6437A84744A6FE85EE63C61E4EDEA58DFA07B84AE70B33FC1BCA334FB85BC8D2B0AE705DB5994594D2962389497BC28A09E407AC16877011C1D645962CB1D849D
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDPMzEzj05OQ86HPq4eHFAArbF+KoCREkExn2GNv21sQbrJgh4N
19TTyP0dUh6F3e7u6Um1KbojXq9sVoo8m4m2Q3qEdEpv6F7mPGHk7epY36B7hK5w
sz/BvKM0+4W8jSsK5wXbWZRZTSliOJSXvCignkB6wWh3ARwdZFliyx2EnQIDAQAB
AoGAWTkFHdu+74rZW3nNRqAQf0pMXTT2KgI/Wpv0STK+btibE3zZbkKbnhs1i7O5
+xFHe0+v8rgmNGboiXF2k4SytqgO5yod8Nz1TDRCj5B1soifrP50dnhlELbdMvwb
xWMvXf6VAfVKrJKPzdAyyCRd5CU3LYXFMQfpxWdbwTybG0ECQQDzWIpQZTVNX3l7
1WHi0GF3N296PZNyS8CijuwHjeinOHEubIAACzrQtKbDinPfnDx7EmaiTAx5EZVk
8wP0V8UtAkEA2fl4z6P/aEdlC6uL16D0tfVo+9T+VoBog844TfBk1IPSFM7x5xiQ
a0WH9aonbNg45M2XCdUZhiyb7RDAIk5DMQJBALAZ/AZQJ7G1jRG7itn8GPyQRoE8
/G4zOdWp/k89OAeDhgylgkAF4GtWwHQzxsUkqHQcDeAXjtMykV17q/nwZoUCQQCx
3Px0yohtqdxNAoUQxZkJJSCuZaXIJe2ip9KP3noYYxw4uIjxnryxm8IOdvLGwUTj
htMZRdcXAi2V6xYsqBnxAkB49wUy4pQfBWRtCNRlRs6ojI7nLnwG/b0Qj7SJMRd9
ZmBgzYIwJTaLD4z/Xx9BAuNbJDqeavSFxnlPcmuyCMrA
-----END RSA PRIVATE KEY-----


Então gero o arquivo com as DAV´s do período de nome DAV_ELET.TXT
D1108640810001210011994280034               DECIO PLABIO ARAUJO ORNELAS                       
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001440000000000000120100721Orcamento                     00023000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001439000000000000220100721Orcamento                     00000100000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001439000000000000320100721Orcamento                     00015000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001439000000000000420100721Orcamento                     00003000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001439000000000000520100721Orcamento                     00020000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001440000000000000620100721Orcamento                     00020000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001440000000000000720100721Orcamento                     00015000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001440000000000000820100721Orcamento                     00020000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001440000000000000920100721Orcamento                     00003000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001441000000000001020100721Orcamento                     00020000000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001442000000000001120100721Orcamento                     00003000000000
D210864081000121                                                                          000000000001220100721Orcamento                     00015000000000
D210864081000121                                                                          000000000001320100721Orcamento                     00000100000000
D210864081000121                                                                          000000000001420100721Orcamento                     00000100000000
D210864081000121                                                                          000000000001520100721Orcamento                     00000100000000
D2108640810001214708050815165        ECF-IF BEMATECH            MP20FI              001443000000000001620100721Orcamento                     00038200000000
D210864081000121                                                                          000000000001720100721Orcamento                     00020000000000
D9108640810001210011994280034 000017


No final gero a chave de validação com o seguinte comando;
                               OPENSSL dgst -md5 -sign CHAVE.PEM -out EAD.TXT -hex DAV_ELET.TXT
Este comando retorno para o arquivo EAD.TXT a chave de validação;
RSA-MD5(VAL_ELET.TXT)= 6c5cb5bceab541f70995a9183ab42f4f52e0c56cbbf5a6ca6b71abf7a549a9598a6cc5273bd59b63378f9f49afb1d7252aaaceb672dbe1e13cfb2de5fea72f5374e918a08868316356bd2bdbb8594c1cb1d583481af745a479e07e729b17cdc460efe2b00f13bcfbef9c58867341905897f5d94acad0be1caf11f06e9f54e087

Elimino RSA-MD5(VAL_ELET.TXT)= e adiciono o restante no final do arquivo logo a frente de EAD.


Vou até o arquivo Set System Informatica.xml altero o Modulo
<?xml version="1.0"?>

<empresa_desenvolvedora>

                <nome>Set System Informatica</nome>

                <chave>         
                                <modulo>CF3331338F4E4E43CE873EAE1E1C5000ADB17E2A80911241319F618DBF6D6C41BAC9821E0DD7D4D3C8FD1D521E85DDEEEEE949B529BA235EAF6C568A3C9B89B6437A84744A6FE85EE63C61E4EDEA58DFA07B84AE70B33FC1BCA334FB85BC8D2B0AE705DB5994594D2962389497BC28A09E407AC16877011C1D645962CB1D849D

</modulo>
                               <expoente_publico>10001</expoente_publico>
                </chave>

</empresa_desenvolvedora> 


Quando vou validar da [b]Assinatura Inválida[/b].

Então é isso ai:
Se tiver faltando alguma coisa é só entrar em contato.
José Carlos

José Carlos

Curtidas 0

Respostas

Gilmar Fernandes

Gilmar Fernandes

22/07/2010

Que linguagem você está usando ???

Qual impressora ???

Outro detalhe, a chave publica e privada você gera uma única vez (é uma identificação da sua empresa, ela é única), você não precisa gerá-la cada vez que você for gerar o arquivo .txt.
GOSTEI 0
José Carlos

José Carlos

22/07/2010

Que linguagem você está usando ???

Qual impressora ???

Outro detalhe, a chave publica e privada você gera uma única vez (é uma identificação da sua empresa, ela é única), você não precisa gerá-la cada vez que você for gerar o arquivo .txt.


Delphi * Mais to querendo fazer manual
Pq tem um parte do sistema q ta ainda em Clipper
o ECF é Bematech

Sim a Chave Publica e privada só estou gerando uma vez. Coloquei todo o procedimento que usei..

GOSTEI 0
Gilmar Fernandes

Gilmar Fernandes

22/07/2010

Uma vez gerado o XML, você não altera também não. O Módulo (que é a chave pública) é gerado uma única vez. Esse XML é usado SÓ para validar a assinatura.

Agora como você está usando Delphi, usa os recursos da propria Bematech (DLL), não tem dor de cabeça. É muito simples.

  { Funcoes de Assinatura Digital }
  function genkkey(ChavePublica: String; ChavePrivada: String): integer; stdcall; external 'sign_bema.dll';
  function generateEAD(NomeArq: String; ChavePublica: String; ChavePrivada: String; EAD:String; Sign: Integer): integer; stdcall; external 'sign_bema.dll';


// Aqui você passa o path do arquivo a ser assinado
function AssinaArquivoEAD(W_Arquivo :String) : Boolean;
var
  W_EAD: String;
begin

      // A Chave Publica e Privada, devem ser geradas uma unica vez e armazenada.

      //
      // Assina o Arquivo Digitalmente
      //
      W_EAD := Repetir(' ', 256);

      W_Comando := IntToStr(GenerateEAD(W_Arquivo, WVG_ChavePublica, WVG_ChavePrivada, W_EAD, 1));

      if Erros then
        Result := True
      else
        Result := False;

end;


GOSTEI 0
POSTAR