Pessoal, boa tarde.
Vocês poderiam nos auxiliar com relação ao código para geração da chave criptografada randomicamente, a qual será utilizada para encriptar o lote XML?
Essa chave deve ter o padrão AES-CBC 128, mas não sabemos se os exemplos de código fonte existentes na Internet atendem o que a RFB solicita.
Alguém já possui esse código testado e poderia disponibilizar um exemplo para adequar nossa aplicação?
Nossa aplicação é desenvolvida em C#.
Outra pergunta: Sabem me informar se é obrigatória a utilização da compactação (GZIP) antes de transmitir os arquivos?
Agradeço desde já!
Abraços!
Oi, Renato! Bom dia!
Estou desenvolvendo também rotinas para criptografia, no entanto ainda estou recebendo o código de erro MS0043 de retorno da receita.
Estou desenvolvendo em VB .Net, que é bem similar ao seu C#.
Para gerar a chave randomicamente, estou utilizando as seguintes linhas:
Dim random As New System.Security.Cryptography.RNGCryptoServiceProvider
Dim key = New Byte(15) {}
random.GetBytes(key)
Na função que faz a criptografia, é gerado um vetor chamado “IV”, que entendo deve ser concatenado à chave gerada. A função para fazer a criptografia eu peguei de exemplos da internet também:
Private Function EncryptStringToBytes_Aes(ByVal plainText As String, ByVal Key As Byte(), ByRef IV As Byte()) As Byte()
Dim encrypted As Byte()
Using aesAlg As Aes = Aes.Create()
aesAlg.Key = Key
aesAlg.GenerateIV()
IV = aesAlg.IV
aesAlg.Mode = CipherMode.CBC
Dim encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
Using msEncrypt = New MemoryStream()
Using csEncrypt = New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
Using swEncrypt = New StreamWriter(csEncrypt)
swEncrypt.Write(plainText)
End Using
encrypted = msEncrypt.ToArray()
End Using
End Using
End Using
Dim combinedIvCt = New Byte(IV.Length + encrypted.Length – 1) {}
Array.Copy(IV, 0, combinedIvCt, 0, IV.Length)
Array.Copy(encrypted, 0, combinedIvCt, IV.Length, encrypted.Length)
Return combinedIvCt
End Function
Mas, como disse anteriormente, não estou conseguindo receber um retorno positivo do WS da receita. Esse erro que recebo diz que não foi possível descriptografar.
Quanto à compactação, ela não é obrigatória, somente a criptografia. Se for utilizar a compactação, deve ser utilizado outro endereço de WS.
Vocês já estão enviando algo e tem algum tipo de retorno?
Abraço!
Anderson, recebemos orientações sobre a nova forma de transmissão bem recentemente. Ainda estamos entendendo a sequência toda.
Só sei que além de utilizar seu código para encriptar o XML, você precisa fazer uma nova criptografia, utilizando o certificado que a RFB postou no portal da E-Financeira.
Ou seja… nós ainda estamos no primeiro passo. Você já deve estar bem adiantado.
Você teria como passar um exemplo de como ficaria o XML final para transmissão?
Obrigado!
Já tive problemas com o tamanho, mas porque estava passando a chave maior. Por padrão, essa classe “Aes” já inicializa a propriedade “KeySize” com o valor 128. Mesmo assim, setei a propriedade com a linha abaixo:
aesAlg.KeySize = 128
Mesmo assim, continuo recebendo o retorno “MS0043: Não foi possível descriptografar o lote de eventos utilizando a chave informada.”
Vocês já conseguiram algum tipo de retorno?
Anderson, muito obrigado pelo retorno.
Não percebi no seu código a definição do tamanho em 128. Será que não estaria faltando isso?
No link abaixo temos exemplo em VB.NET e C#. Em ambos é definido o KeySize.
http://www.obviex.com/samples/encryption.aspx
No exemplo do site está sendo utilizado o tamanho em 256, mas podemos alterar para 128. Talvez tenha algum método / propriedade que possamos adequar ao código.
Vou tentar converter seu código em C# e ver no que dá.
OBRIGADO!
Esse é um exemplo de XML que estou enviando, mas estou recebendo o retorno MS0043:
<eFinanceira xmlns=”http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_2_0″>
<loteCriptografado>
<id>31</id>
<idCertificado>88edffa74bf7984197c1749ba96f56372dc02bac</idCertificado>
<chave>ULW7UHdQ2OeDxSAOg04XLcvBbrb366Wjw/J5DwefrRhjWBoKdHxUdvf06ECKA+77DukbmW6QPbLDVK1iONhSPQl5+8lLIw+gQgxF8oaJ/gnD+ixFp6YWr2WYNIl+Cfh5LzDu3odUxqqMplmdwvTgFgpFx/uCd9S0SJn/xB08Yu2m4XTIqQ61Jwi+mSoC7pPYG8+TitCjP+Fg4m44AjPgQMVxS/R3ERd4FTZm5/FUDxdxRQRiukbFVpq8ctTwjD+Vnmp0cfOPVqOfDIfRchmFgeuhInllwiCKG0E4VtITQqpUJGPJuZAPp3YINneSH1U5aI7myHLh/3nY5Jcni389iw==</chave>
<lote>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</lote>
</loteCriptografado>
</eFinanceira>
Estranho, Anderson.
Estou tentando transmitir o arquivo exemplo acima, mas estou recebendo a mensagem:
MS1182 – A utilização do modelo de criptografia de dados da e-Financeira passa a ser obrigatória para quaisquer arquivos transmitidos a partir do primeiro dia útil de março de 2018.
Você está fazendo a transmissão diretamente da sua aplicação ou pelo link de upload manual da receita?
Ah, outro detalhe. O namespace que você está informando na primeira tag do XML deveria ser:
http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_0_0
você está enviando como v1_2_0
Me corrija se eu estiver errado, ok ?
Obrigado!
Oi, Renato!
Estou fazendo o envio pela minha aplicação, diretamente para o WS https://preprod-efinanc.receita.fazenda.gov.br/WsEFinanceiraCripto/WsRecepcaoCripto.asmx
O namespace que está no manual para compactação e criptografia está realmente como v1_0_0. No entanto, quando envio neste namespace, o WS retorna o seguinte erro:
MS0041: Erro na estrutura do xml do lote criptografado. Problema(s) encontrado(s) : O namespace http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_0_0 informado no documento XML não é um namespace reconhecido.
Quando enviamos com o namespace v1_2_0, não ocorre o erro. Esse namespace encontra-se no manual de preenchimento.
Tentei enviar o mesmo arquivo via página da receita, e obtive o mesmo retorno do WS, que é o erro MS0043. A página que usei pra enviar foi:
https://preprod-efinanc.receita.fazenda.gov.br/EFinanceira/EnvioArquivoCriptografado
Esse arquivo só pode ser enviado pra Pré-Prod, pois o thumbprint e o certificado que utilizei foi o de Pré-Prod.
Agora sim, Anderson. Tive o mesmo resultado que você. Eu estava usando o link de upload manual que consome o webservice antigo.
Sabe dizer se existe algum passo a passo mais detalhado disponível na web, para poder executar todas as etapas de criptografia dos lotes?
Estamos começando a pegar mais pesado nesse assunto a partir de hoje.
Se eu tiver novidades, te aviso.
Obrigado!
Pessoal,
Entendi algumas coisas e consegui um resultado de sucesso da receita:
O certificado para testes deve ser o original da empresa (TOKEN ou certificado real);
Os lotes devem seguir com a assinatura do certificado normal;
O certificado para encriptação do XML de envio deve ser o disponibilizado pra isso (eles podem ser baixados no site da e-financeira da Receita);
Implementei em c# s criptografia do envio da e-financeira. Usei o mesmo tipo de código do post do Anderson Oliveira, entretanto fiz algumas alterações:
Não concatenei os dados com o IV;
Retorne um array com a concatenação da CHAVE + IV =>
== isto não deve ocorrer ===
//var combinedIvCt = new byte[IV.Length + encriptedData.Length];
//Array.Copy(IV, 0, combinedIvCt, 0, IV.Length);
//Array.Copy(encriptedData, 0, combinedIvCt, IV.Length, encriptedData.Length);
==Isto deve ser feito===
var combinedKeyIv = new byte[key.Length + IV.Length];
Array.Copy(key, 0, combinedKeyIv, 0, key.Length);
Array.Copy(IV, 0, combinedKeyIv, key.Length, IV.Length);
return new KeyValuePair<byte[],byte[]>(combinedKeyIv, encriptedData)
===================
Depois voce pega essa “combinedKeyIv” e encripta usando o certificado público de envio (seja o de teste ou de produção), a chave do certificado já tem os tamanhos necessários:
Segue exemplo:
public static byte[] EncriptarPrivateKeyToRSA(byte[] privateKey, X509Certificate2 certificado)
{
using (var cryptoProvider = (RSACryptoServiceProvider)certificado.PublicKey.Key)
{
//cryptoProvider
return cryptoProvider.Encrypt(privateKey, false);
}
}
Opa Evandro! Ótimas notícias!
Sinceramente, pra mim ainda não está claro como devo utilizar os certificados.
Abaixo está meu entendimento dos steps. Por favor me corrija se eu estiver errado.
1) O lote XML deve ser assinado digitalmente como já era feito nas transmissões passadas. Até aí sem novidades.
2) Geração de chave criptográfica:
Entendo que vamos usar o código abaixo:
Dim random As New System.Security.Cryptography.RNGCryptoServiceProvider
Dim key = New Byte(15) {}
random.GetBytes(key)
3) Chamar a função EncryptStringToBytes_Aes, passando como parâmetro o XML assinado e a Key gerada no item 2. Essa função deve ter os ajustes informados no seu post.
4) A execução da função retorna um array de bytes, correto? Eu devo chamar a outra função ==> EncriptarPrivateKeyToRSA para fazer a segunda etapa de criptografia. Como parâmetro, passo o array de bytes calculado no item 3 e o certificado (88edffa74bf7984197c1749ba96f56372dc02bac).
5) O resultado desta função será o conteúdo da tag <lote></lote>, correto?
6) O que deve ser inserido na tag <chave></chave> ? A chave gerada no item 2 ?
Muito obrigado pelo apoio!
Espero que o Anderson também seja beneficiado com seu post!
Abraços
Espero que tenha ajudado, pq sofri quase uma semana em cima disso até conseguir um resultado positvo…rs
Seguindo seus pontos:
Item 1 => correto (seguindo o processo normal de assinatura);
Item 2 => a chave tem que ser um New Byte(16);
Item 3 e 4=> a função terá de retornar o array de dados encriptados e o array com a concatenação da chave (gerada no item 2) com o IV utilizado pra encriptar os dados;
Este ultimo array (Key+IV) será encriptado por EncriptarPrivateKeyToRSA usando o certificado de envio;
Item 5 =>A tag ‘lote’ terá o conteudo encriptado na funcao EncryptStringToBytes_Aes citada no item 3, já com os ajustes (o lote não leva o array com a chave encriptada);
Item 6 => A tag ‘chave’ leva o conteudo do array de dados encriptados da função EncriptarPrivateKeyToRSA, ou seja o resultado da encriptacao do array KEY+IV (32 bytes) usando o certificado de envio;
********** Não esquecendo que o conteudo das tags chave e lote são no formato string com base 64. (em c# ou Vb.net pode-se use o método Convert.ToBase64String, este método recebe um array de bytes)
Muito obrigado, Evandro! Com a sua alteração, também consegui enviar com sucesso!
Anderson / Evandro,
Tivemos alguma evolução, mas ainda estamos com o erro MS0043. Mas estamos muito perto.
Se não for pedir muito, vocês poderiam verificar onde estamos errando?
Basicamente, tenho um botão onde chamo as duas funções comentadas nesse post e jogo a chave e o lote em text boxes distintos.
MUITO OBRIGADO!
private KeyValuePair<byte[], byte[]> EncryptStringToBytes_Aes(string plainText, byte[] Key, ref byte[] IV)
{
byte[] encrypted;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.KeySize = 128;
aesAlg.GenerateIV();
IV = aesAlg.IV;
aesAlg.Mode = CipherMode.CBC;
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
var combinedKeyIv = new byte[Key.Length + IV.Length];
Array.Copy(Key, 0, combinedKeyIv, 0, Key.Length);
Array.Copy(IV, 0, combinedKeyIv, Key.Length, IV.Length);
return new KeyValuePair<byte[], byte[]>(combinedKeyIv, encrypted);
}
public static byte[] EncriptarPrivateKeyToRSA(byte[] privateKey, X509Certificate2 certificado)
{
using (var cryptoProvider = (RSACryptoServiceProvider)certificado.PublicKey.Key)
{
//cryptoProvider
return cryptoProvider.Encrypt(privateKey, false);
}
}
private void button1_Click(object sender, EventArgs e)
{
//cria a chave randomica de 16bytes
RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
byte[] key = new byte[16];
random.GetBytes(key);
byte[] retIV = null;
//encriptando o xml
KeyValuePair<byte[], byte[]> retornoKeyIV = EncryptStringToBytes_Aes(txtXML.Text, key, ref retIV);
//instancia um novo certificado, enviado pela receita
X509Certificate2 cert = new X509Certificate2(“C:\\temp\\preprod-efinancentreposto.receita.fazenda.gov.br.cer”);
byte[] retornoKeyIVEncrypted = EncriptarPrivateKeyToRSA(retornoKeyIV.Key, cert); //chave utilizada para descriptografar o xml enviado para a receita
string lote = Convert.ToBase64String(retornoKeyIV.Value);
txtLote.Text = lote;
string chave = Convert.ToBase64String(retornoKeyIVEncrypted);
txtChave.Text = chave;
}
Renato, bom dia.
Fiz algumas coisas um pouco diferentes, mas não sei se são o motivo de não estar funcionando pra você.
Pra combinar o a Chave + IV, não usei a função “Array.Copy”… Criei um array novo de 32 posições e copiei primeiro a chave e depois o IV. A minha função “EncryptStringToBytes_Aes” só retorna o XML encriptado, e eu pego por referência o IV gerado e faço essa combinação.
Não sei também se é um problema do VB, que no C# não tem, mas não consegui gerar um objeto do tipo X509Certificate2 diretamente do arquivo da receita. Tive que criar primeiro um objeto do tipo X509Certificate, e depois criar o objeto do tipo X509Certificate2, como nas linhas abaixo:
Dim cert1 As X509Certificate = X509Certificate.CreateFromCertFile(“C:\Temp\preprod-efinancentreposto.receita.fazenda.gov.br.cer”)
Dim cert As New X509Certificate2(cert1)
Não sei se é isso, mas só encontrei essas diferenças para o que estou fazendo.
Anderson, por favor desculpe pela minha limitação e frustração, mas ainda não estou conseguindo fazer a transmissão. Ainda ocorre o erro MS0043.
Fiz o seguinte:
- Alterei a função EncryptStringToBytes_Aes para retornar apenas o Lote criptografado. O IV também retorna por referência.
- Converto o lote criptografado para base 64, definindo assim a tag LOTE. (é isso?)
- Criei uma nova variável Byte de 32 posições e concatenei a Key randômica e o IV. A mensagem de erro na transmissão ocorre, tanto com a sua forma de juntar as variáveis quanto com a forma informada pelo Evandro.
- Crio a instância do certificado de envio (.cer). A sua forma de criar o certificado não dá um resultado diferente.
- Chamo a função EncriptarPrivateKeyToRSA, passando como parâmetro a variável byte de 32 posições (key + IV) e o certificado.
- O resultado da chamada dessa função (em bytes) é convertido pra base64, definindo assim a tag CHAVE.
Ao meu ver, essas etapas estão de acordo com tudo que conversamos até o momento, e também de acordo com o manual. Mas ainda não está funcionando. Algum detalhe mínimo está faltando.
Segue meu código atualizado:
private byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, ref byte[] IV)
{
byte[] encrypted;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.KeySize = 128;
aesAlg.GenerateIV();
IV = aesAlg.IV;
aesAlg.Mode = CipherMode.CBC;
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
}
public static byte[] EncriptarPrivateKeyToRSA(byte[] privateKey, X509Certificate2 certificado)
{
using (var cryptoProvider = (RSACryptoServiceProvider)certificado.PublicKey.Key)
{
//cryptoProvider
return cryptoProvider.Encrypt(privateKey, false);
}
}
private void button1_Click(object sender, EventArgs e)
{
//cria a chave randomica de 16bytes
RNGCryptoServiceProvider random = new RNGCryptoServiceProvider();
byte[] key = new byte[16];
random.GetBytes(key);
byte[] retIV = null; //irá retornar byRef na chamada da função
//passa o XML e a chave randomica como parametro
//retorna o Lote encriptado + IV byRef
byte[] retornoLoteEncriptado = EncryptStringToBytes_Aes(txtXML.Text, key, ref retIV);
//converte para base64 e define conteúdo da tag LOTE
string lote = Convert.ToBase64String(retornoLoteEncriptado);
txtLote.Text = lote;
//instancia o certificado de envio
X509Certificate2 cert = new X509Certificate2(“C:\\temp\\preprod-efinancentreposto.receita.fazenda.gov.br.cer”);
//X509Certificate cert = new X509Certificate(“C:\\temp\\preprod-efinancentreposto.receita.fazenda.gov.br.cer”);
//X509Certificate2 certEnvio = new X509Certificate2(cert);
//concatena CHAVE + IV em uma variavel byte de 32 posições
var keyFinal = new byte[key.Length + retIV.Length];
Array.Copy(key, 0, keyFinal, 0, key.Length);
Array.Copy(retIV, 0, keyFinal, key.Length, retIV.Length);
//Popula uma lista de bytes com o conteudo da CHAVE e o conteudo do IV
//List<byte> listFinal = new List<byte>();
//listFinal.AddRange(key);
//listFinal.AddRange(retIV);
//byte[] keyFinal = new byte[16];
//keyFinal = listFinal.ToArray();
//chave utilizada para descriptografar o xml enviado para a receita
byte[] tagChave = EncriptarPrivateKeyToRSA(keyFinal, cert);
//converte para base64 e define conteúdo da tag CHAVE
string chave = Convert.ToBase64String(tagChave);
txtChave.Text = chave;
}
}
Mais uma vez, obrigado!
Voce pode disbolibilizar no github
Evandro, mesmo convertendo o XML da forma como você orientou, ainda estamos com a mensagem MS0043
Engraçado é que o lote criptografado ficou bem reduzido, mesmo se o XML for grande, por ex:
KP8l5fjAEJrf65pd4FXwxA==
Você sabe se existe algum local onde eu possa enviar meu protótipo para vocês testarem?
Obrigado!
Pessoal,
Pelo que percebi, voces não estão encriptando o XML em base 64.
Pega o valor em bytes do XML, convert para string de base 64 e pega o valor em bytes desta string. Este ultimo array, o dos bytes da string base 64, que será criptografado para envio.
Evandro / Anderson
Segue link com a solution completa.
https://github.com/rtrocoletto/Cripto_eFinanceira
Se trata de um protótipo, onde no form são exibidos o lote e a chave criptografados.
O XML de vocês pode ser colado no text box para testes mais precisos.
Agradeço se puderem apontar onde estamos errando.
Obrigado!
Quanto a criptografar sem converter pra Base64, é isso que estou fazendo e está dando certo. Eu só converto pra Base64 depois de criptografado.
Peguei um lote que gerei no meu sistema, e comparei as criptografias. Deu bastante diferença no lote:
Chave gerada pelo seu protótipo:
A6bfxwNwtGTOQYqFgnNcQYr1o4xBCr0jhcvj3aU8PDdWiS56DoB4dQYfT8TunFVLNz2cSAKX7PKDn1ZNHaiGibZPCuI8RYwH+V2OkizgxacSe6rgkDraT4IwvV+pU53dQ22an+cbSIKp9y0deuo4or4XX2iJTFidW+rqZbF3Hy3OLLema+gsY1gPDo8zyZom5Whg5u+sEg8Uj+OiuLLCziC6IvK1Fh3dnrGZf+M5NwQYJNeVJVbfZsrKdL6E0BGdruHz3bYMzWVadPysrQvQgWbhPxf2uERKU9JEbu/2nbTPrIVEFiLMo1lNk78QxlDPAXD0LnbYfCTsXoQmFty1gQ==
Chave gerada pelo meu:
d8IvTucbHr936TWtRZUyZOIgMkQLTVi/+f5CBt2XUhvPjWFQ9+Tbdx26A5CtGO4mkFiCMDA2d3KwvPB5ziyllJNY/z5a49ZWnD7di2YNxeFVCI4tcqGyqpEHIbzABc05zbJ71DV4dZlCLP3OSMDmeWS308bnMCitUQJBCcVruX3HNRgf6F4JL0PC9KqHryI2iiFsChADkxJSkKM6aqDblC8kDOhuj0qEEEy45wbmkrxwAI1pqVeQxdKF7xvBJPYrbdtGEfRGvuqwMiQFGQKL/lTUIFy0dyHI83vZc8mIlSB68pCeNm7bkWbqGukMhDCYfe1NVFieCPJjg8zgjGVnqQ==
Lote gerado pelo seu protótipo:
JqL1CEmcOD4FI7dPCUW0Ew==
Lote gerado pelo meu:
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
Bem, vamos lá.
Eu estava simplesmente colando o resultado dos campos do protótipo num XML físico, pelo Notepad++ mesmo. Esse arquivo eu estou transmitindo pelo link de upload manual da RFB.
Então você vê que devo criptografar o lote XML sem converter para base64 e gerar o XML final pelo código C# mesmo. É isso?
Se você utilizar um lote XML seu… gerar o XML final pela sua rotina, colocar o mesmo lote XML no meu protótipo e gerar as tags LOTE e CHAVE. A diferença é muito grande?
Obrigado!
Entendi. Cheguei a ver o protótipo e não encontrei outra diferença muito grande do que eu estou fazendo.
A questão pode estar também na hora de fazer e colocar as informações no XML a ser enviado. Tanto a chave encriptada quando o lote encriptado eu estou convertendo para Base64 somente na hora da criação do elemento XML. Estou fazendo assim:
Dim chave As XmlNode = xmlDoc.CreateElement(“chave”, xmlNS)
chave.AppendChild(xmlDoc.CreateTextNode(Convert.ToBase64String(EncriptarPrivateKeyToRSA(chaveVetor, cert))))
ndLote.AppendChild(chave)
Dim lote As XmlNode = xmlDoc.CreateElement(“lote”, xmlNS)
lote.AppendChild(xmlDoc.CreateTextNode(Convert.ToBase64String(lotecripto)))
ndLote.AppendChild(lote)
Olá Anderson, bom dia
O Evandro fez um comentário ontem, informando que o modelo que ele desenvolveu converte o XML para Base64 antes de criptografar. Como o dele está funcionando, tentei aplicar isso no meu código, entende?
Mas parece que não é isso. E como PlainText também não funciona.
Chegou a ver o meu protótipo do GitHub ?
Acho que você terá uma visão melhor do que desenvolvemos aqui.
É bem simples e o código está bem comentado.
Vou tentar novamente revisar tudo criptografando o XML como texto mesmo.
Obrigado!
Renato, bom dia!
Vi que na função “EncryptStringToBytes_Aes”, logo nas primeiras linhas o conteúdo do XML está sendo convertidos pra bytes em Base64. Eu não estou fazendo assim.
Na hora de encriptar, estou passando o XML como texto mesmo. Eu tentaria fazer essa alteração:
//swEncrypt.Write(xmlFinalBytes);
swEncrypt.Write(plainText);
A conversão pra Base64 só estou fazendo na hora de colocar o conteúdo encriptado na TAG no XML a ser enviado.
Será que é isso?
Anderson / Evandro
Finalmente conseguimos um resultado positivo!
CONSEGUIMOS A TRANSMISSÃO!
Seguem alguns comentários:
- Pelo C#, o XML não deve ser convertido pra base64 antes de criptografar. A criptografia deve ser feita no XML diretamente.
- Na função “EncryptStringToBytes_Aes”, a propriedade KeySize estava sendo definida com o valor 128, afinal o modelo definido pela RFB é o AES-CBC 128.
Simplesmente comentei essa linha, arriscando que poderia ser desnecessário e a transmissão foi feita com sucesso! Claro que o conteúdo do lote XML era inválido, mas só de passar pela criptografia já foi um alívio.
QUERO AGRADECER MUITO A AMBOS, PELA PACIÊNCIA, COLABORAÇÃO E AGILIDADE NAS RESPOSTAS DOS POSTS! SEM SUAS DICAS ESTARÍAMOS BEM ATRASADOS AINDA.
Vocês acham interessante criar um outro post no fórum, contendo o protótipo com a solução ajustada?
Com certeza deve haver outras pessoas com as mesmas dificuldades que eu tive.
Outra coisa. Vocês aplicaram compactação aos lotes? Tiveram performance melhorada?
MAIS UMA VEZ, OBRIGADO!!!
Fala Flávio, boa noite.
Desculpe pela demora.
Sim, o protótipo do github contém a criptografia que vou utilizar na minha aplicação, no entanto, não consegui aplicar o gZip. Vou fazer sem ele mesmo.
Boa noite Renato, tudo bem? O código que esta no github esta com a criptografia definitiva que vc desenvolveu?
Fala Rodrigo, beleza?
Você está fazendo teste com o link de upload manual ou via WS ?
Eu consegui fazer a transmissão apenas via link manual, pois não apliquei o novo WS na minha aplicação.
Sei que a versão 1.2.0 deve constar até mesmo no namespace do lote XML que será criptografado. Você está fazendo assim também?
Aproveitando, você pode me passar a função pra aplicar o GZIP no lote, antes de ser criptografado? Estou patinando nessa parte ainda =( .
Muito obrigado!
No aguardo
Abraços
Pessoal, boa noite!
Estou com o mesmo problema que o Márcio descreveu do erro “MS1092 – Versão do lote inválida. Deve ser utilizada a versão 1.2.0.”., porém o leiaute já foi atualizado para a versão 1.2.0.
Vocês têm alguma dica do que pode ser. É a última coisa que falta pra eu terminar a atualização do leiaute e a transmissão criptografada e compactada.
Desde já agradeço;
vc conseguiu via webservice ou upload manual?
vc encriptou o xml inteiro ou só a partir da tag ?
fiz uma função para descriptar, aqui ocorre tudo certo, em pre-prod só recebo “MS0043 Não foi possível descriptografar o lote de eventos utilizando a chave informada.”
Key+IV: k7tJyXUkrwsWZxyA5IzFjWnirz8Ia++gv1O2HIWTBlo=
Key+IV RSA: CGjedHIWFPi7j6i9YCm82rKi4GrSRbK0KVqpj+vPGVf/teISSTC/LrSYly2AtP7JcUFiKCGIQQBhXATjAGoUCXkmsdaRX0zju7LaHdh1BeAxRh4mnGBK/DDewzIGztiJzZzqAE6yoPaiQJkM+KXw8Om1jtKMO6nAW367t0tCJtXFbOXjNAXMRgWA3HpX08wntyDMEcS6DBzV8YxXahOJlCpTb9En1FxsOZ58ZUWI053YpQc8B3jmvhbb4151OiZIEFC2Xhrr1OBTkUG2XM6Nu2kcQ0f22HeRgaqKCDTyFzYLK9wSKqmqT3X0tXYPy+O8t/8hwQJSYgJuZXX6ikHFZw==
Marcio, bom dia.
Verifique sua caixa de spams… geralmente os emails de notificação do inbox do forum vão pra lá.
abs
Márcio, te mandei msg inbox, ok?
abs
Renato, Boa tarde, tubo bem.
Eu também estou implementando a criptografia, em c# e segui seu exemplo. Obrigado por compartilhar.
Quando faço a transmissão via link: https://preprod-efinanc.receita.fazenda.gov.br/EFinanceira/EnvioArquivoCriptografado, me retorna “MS1092 – Versão do lote inválida. Deve ser utilizada a versão 1.2.0.”.
Você passou por isso? Estou usando v1_2_0 em todos os lugares:
XML Lote:
…
XML LoteCriptografado:
Outro erro, quando tento transmitir pelo WS, dá erro: (500) Erro Interno do Servidor.
O que estou fazendo é gerando o loteCriptografado em string e transformando em byte[],
como antes e mandando para o WS https://preprod-efinanc.receita.fazenda.gov.br/WsEFinanceiraCripto/WsRecepcaoCripto.asmx:ReceberLoteEventoCripto.
Eu já estava transmitindo compactado até final de fevereiro/18, mas agora estou partindo do xml normal.
Agradeceria muito se puderem me ajudar.
Fala Claudio, beleza?
Me chama inbox, por favor?
Valeu!
Boa Tarde Renato,
Estou começando agora a fazer o processo de compactação e criptografia, e estou com grande dificuldade, estou sempre recebendo o erro MS0043 nos meus testes, existe a possibilidade de você colocar as alterações que vc descreveu acima no código que esta no exemplo desse tópico? segui suas dicas e mesmo assim não esta dando certo. vc pode me ajudar?
Desde já agradeço
Claudio Faria
Que bom que conseguiu, Renato! A ajuda aqui pra mim também foi muito valiosa!
Ainda não fiz a compactação, porque ela ainda não é obrigatória. Aqui na empresa estamos dedicando aos itens obrigatórios primeiro. Mas, pelo que vi, não é tão complicado. Tem que fazer a compactação antes da criptografia. Então, ao invés de criptografar o texto, tem que passar os bytes compactados.
Abraço!
Pessoal, bom dia.
Estou fazendo testes com transmissão de lotes aplicando GZIP e não estou conseguindo resultado positivo.
Primeiramente, estou tentando fazer a transmissão através do link manual da RFB, mas não sei se esse cara está preparado para transmitir informações com a aplicação do GZIP. Sabem se por lá é possível essa transmissão?
Como vocês estão aplicando o método?
- Gerar o lote xml
- Aplicar o GZIP sobre o texto do XML.
- O resultado da compactação é um array de bytes, correto?
- Aplicar a criptografia sobre esse array de bytes, sem converter para string Base64, correto?
- A criptografia vai gerar a chave combinada (key + IV) e o lote criptografado.
- Na transmissão sem compactação, utilizamos um XML em formato texto, contendo o lote criptografado e a chave para decriptografia. Até aí já temos a solução.
- O que fazer na transmissão com GZIP? Devemos converter o XML para um Byte[]? O método ReceberLoteEventoGzip espera um byte como parâmetro, mas não sei ao certo o conteúdo desse byte.
Podem me ajudar novamente?
Obrigado!
Boa Tarde.
Anderson, Renato, Evandro e todos os outros que estão acompanhando esse post.
Também estou no desenvolvimento dessa criptografia. Tenho acompanhado o post de vcs (O que inclusive tem me ajudado a entender melhor esse fluxo). No entanto confesso que o processo ainda se encontra um pouco confuso para mim.
Coisas como por exemplo: Após assinar o xml. Devo criptografo o arquivo inteiro ou apenas mando a criptografia como tags de lote e chave criptografadas como vi no inicio do post.
Agradeço desde já qualquer ajuda, esclarecimento, fluxo ou exemplo 🙂
Muito Obrigada Renato pela explicação está bem mais claro. Agradeço de verdade te chamarei em inbox. Grata 🙂
Olá Nai,
O processo de geração dos lotes XML (cad. declarante, abertura, mov. financeira, fechamento, etc) não mudou quase nada. O namespace desses eventos deve estar com a versão 1.2.0. Você já gera esses eventos e aplica a assinatura digital via certificado, correto?
Pois então, o lote XML completo, incluindo a assinatura, deve ser criptografado.
Esse processo de criptografia resulta em duas informações básicas:
1) o lote XML criptografado
2) a chave criptográfica gerada no processo, a qual será usada pela RFB para decriptografar o lote.
essas duas informações deverão compor a tag e a tag do XML final de transmissão.
Ficou melhor pra entender?
Se quiser, me chama inbox e falamos melhor.
Tenho um passo a passo para a geração desse XML e um protótipo básico em C# com a parte de criptografia ok ?
Abraços
Pessoal, consegui enviar.
Como as mensagens de erro do SPED não ajudam, a minha solução foi criar um descriptador para testar, se vc n conseguir descriptografar, nem adianta enviar.
o maior problema pra mim, foi a falta do finalblock no CryptoStream
csEncrypt.FlushFinalBlock();
depois disso tudo funcionou;
segue a função de Descriptografia:
public static string Decrypt(string cipherText, Byte[] passPhrase, Byte[] initVector)
{
string decrypted;
Aes aesAlg = Aes.Create();
aesAlg.KeySize = 128;
aesAlg.Key = passPhrase;
aesAlg.IV = initVector;
aesAlg.Mode = CipherMode.CBC;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText));
CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
StreamReader srDecrypt = new StreamReader(csDecrypt);
decrypted = srDecrypt.ReadToEnd();
return decrypted;
}
Fala Guilherme, bom dia
Quando você implementou o WS pra envio de lote criptografado, você se deparou com erros do tipo… o WS espera transmissão HTTP, sendo que você está tentando transmitir HTTPS?
Estou enfrentando esse probleminha… e não estou entendendo onde ajustar pra fazer funcionar.
Desde já, obrigado!
nao uso gzip. os arquivos aqui são pequenos. achei desnecessario
Guilherme, parabéns pela solução!
Você está utilizando GZIP nos seus eventos XML?
Se sim, poderia dar uma luz em como utilizar a função no C#, antes de criptografar?
Se puder, poderia mandar a função que aplica o GZIP?
Muito obrigado!
Pessoal, bom dia,
alguem vem recebendo a seguinte mensagem de retorno?
<codigo>MS0042</codigo>
<descricao>Não foi possível descriptografar a chave com o identificador (thumbprint) do certificado chave pública do servidor da e-Financeira informado. Nao encontrou certificado no servidor com idCertificado = 88edffa74bf7984197c1749ba96f56372dc02bac</descricao>
estou mandado om thumbprint corretamente
Obrigado.
engraçado é a msg, segundo o manual, quer dizer que: MS0042 – Não foi possível descriptografar a chave com o identificador (thumbprint) do certificado
chave pública do servidor da e-Financeira informado:
Ocorre quando foi passado um identificado do certificado (thumbprint) que não é referente ao
certificado do servidor da e-Financeira.
e sim, eu consigo descriptografar de volta o conteúdo.
agora q eu li a mensagem de novo, confundi com o erro de q o thumb tava errado..
ele n consegue descriptografar, vc tentou fazer o caminho inverso? de descriptografar?
mandei um desta forma:
eFinanceira xmlns=”http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_2_0″
loteCriptografado
id id1 /id
idCertificado 88edffa74bf7984197c1749ba96f56372dc02bac /idCertificado
chave chave1 /chave
lote lote1 /lote
/loteCriptografado
/eFinanceira
e amensagem retorna foi:
-eFinanceira xmlns=”http://www.eFinanceira.gov.br/schemas/retornoLoteEventos/v1_2_0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”
-retornoLoteEventos id=”IDC0DF7E55DA43E5708504455905F7E197″
-ideTransmissor
IdTransmissor00000000000000/IdTransmissor
/ideTransmissor
-status
cdStatus1/cdStatus
descRetornoErro no servidor ao recepcionar lote. /descRetorno
-dadosRegistroOcorrenciaLote
-ocorrencias
tipo1/tipo
codigoMS0042/codigo
descricaoNão foi possível descriptografar a chave com o identificador (thumbprint) do certificado chave pública do servidor da e-Financeira informado. /descricao
/ocorrencias
/dadosRegistroOcorrenciaLote
/status
/retornoLoteEventos
por isso está muito estranho…
o link que estou usando é o:
https://preprod-efinanc.receita.fazenda.gov.br/EFinanceira/EnvioArquivoCriptografado
é este que vc utilizou?
qual seu email? vc pode enviar? assim te mando completo
q tenso. aqui ta dando tudo certo. manda a mensagem de erro completa de novo.
tá bem estranho, fiz a alteração e mesmo assim n rolou. vc continua recebendo retorno corretamente?
cara, só por via das dúvidas, troca sua linha inicial para:
eFinanceira xmlns=’http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_2_0′
o meu
eFinanceira xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns=”http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_2_0″
loteCriptografado
id1/id
idCertificado88edffa74bf7984197c1749ba96f56372dc02bac/idCertificado
chave/chave
lote/lote
/loteCriptografado
/eFinanceira
acabei de tentar pelo link que vc me enviou, e ele me retorna a msg 0042.
você pode me ajudar? aí, continua indo blza?
eFinanceira xmlns=’http://www.eFinanceira.gov.br/schemas/envioLoteCriptografado/v1_2_0′
loteCriptografado
id 1 /id
idCertificado 88edffa74bf7984197c1749ba96f56372dc02bac /idCertificado
chave>blabla /chave
lote>blabla /lote
/loteCriptografado
/eFinanceira>
1
88edffa74bf7984197c1749ba96f56372dc02bac
blabla
blabla
desculpe o flood. o comentário retirou as tags.
ID000000007628
88edffa74bf7984197c1749ba96f56372dc02bac
ID000000007628
88edffa74bf7984197c1749ba96f56372dc02bac
Guilherme, pode postar seu xml de envio, sem as tags de chave e lote?
veja o meu:
ID000000007628
88edffa74bf7984197c1749ba96f56372dc02bac
88edffa74bf7984197c1749ba96f56372dc02bac
https://preprod-efinanc.receita.fazenda.gov.br/EFinanceira/EnvioArquivoCriptografado
que coisa… eu acabei de tentar o upload manual, ele me retornou o mesmo erro do 042. Vc usou o certificado de prod ou pre-prod? com o thumb 88edffa74bf7984197c1749ba96f56372dc02bac?
consegui via upload manual de arquivo
pre-prod, link:
https://preprod-efinanc.receita.fazenda.gov.br/WsEFinanceiraCripto/WsRecepcaoCripto.asmx
tava mandando com gzip, to tentando enviar sem pra ver..
vc conseguiu ai?
tá mandando em pre-prod ou prod?
Bom dia pessoa.
Minha aplicação é em java e estava funcionando com criptografia até haver esta mudança na versão do XSD, agora esta retornando direto o erro MS0043.
Ja li todas as mensagem esse forum e minha aplicação já esta concatenando corretamente a chave AES, também estou fazendo a verificação de decriptação dos dados e também esta funcionando.
Alguém saberia me informar se estão conseguindo enviar em ambiente de pré produção?
abaixo segue os dados que estou utilizando.
thumbprint: 88edffa74bf7984197c1749ba96f56372dc02bac
URL: address: https://preprod-efinanc.receita.fazenda.gov.br/WsEFinanceiraCripto/WsRecepcaoCripto.asmx
Percebi que todos estão fazendo em C#, caso alguém esteja fazendo em java ficarei feliz de trocar informações.
Olá!
Estou fazendo em java, vamos nos ajudando.
Att.
Bom dia a todos.
Estou também passando por problemas na transmissão.
No meu caso uso nodejs.
Aqui o que está ocorrendo é que recebo uma resposta vazia.
Alguém sabe me dizer o porque?
Oi João,
Notei esse comportamento quando eu estava mandando conteúdo inválido dentro da tag “bufferXmlComLoteCriptografado”. Vc está convertendo o XML para Base64 antes de incluir nessa tag?
Olá pessoal,
Desenvolvi minha rotina em java.
comunicação via WS OK
criptografia e descriptografia(local ok).
Mas ao postar o arquivo para a Receita sempre recebo o erro:
“Erro no servidor ao recepcionar lote. MS0043 – Não foi possível descriptografar o lote de eventos utilizando a chave informada. “
Seja via upload ou via WS. O curioso é que, localmente criei um par de chaves RSA e consigo descriptografar com sucesso.
Alguém tem alguma sugestão ou ideia?
Daniel, infelizmente não consigo te ajudar com Java.
Desenvolvi um protótipo, em C#, que aplica a criptografia no lote XML e gera as tags CHAVE e LOTE.
Talvez você consiga transcrever para o Java.
https://github.com/rtrocoletto/Cripto_Efinanceira
Detalhe… não estou aplicando GZIP
Boa sorte
Se alguém puder dar um help segue link para a classe de criptografia que criei:
https://github.com/eumagnun/efinanceira/blob/master/CriptografiaService.java
Rossi,
Então.. com relação ao campo ID do XML final, acredito que cada empresa pode utilizar seu próprio critério, porque o objetivo desse cara é simplesmente transitar um conteúdo criptografado. Aqui na empresa não vamos criar um novo controle desse ID. Eu vou utilizar o mesmo ID que uso no lote xml original, porque ele nunca se repete. Nos poucos testes que fiz, não tive problema.
O protótipo que desenvolvi com a ajuda dos colegas do fórum trata apenas a criptografia. Sem Gzip. Se quiser, pode baixar a solution do endereço abaixo:
https://github.com/rtrocoletto/Cripto_Efinanceira
Você cola o XML original num textbox…. o programa aplica a criptografia e gera as tags LOTE e CHAVE.
Essas duas informações eu estava colando num XML físico e transmitindo pelo link de upload manual para os testes.
Precisando de algo, é só chamar inbox, ou por aqui mesmo.
abraços e boa sorte!
Rossi, bom dia
estou em treinamento no momento.
assim que tiver oportunidade eu respondo melhor seu questionamento.
mas SIM vc precisa fazer a conversão do XML final para array de bytes e passar como parâmetro
depois falamos melhor
abs
Bom dia Renato.
Estamos iniciando a implementação do código em C# para compactação e criptografia dos arquivos da e-financeira e gostaria, se possível, de esclarecer uma dúvida.
Após todo o processo de criptografia do XML e da Chave, o manual define um leiaute de um “novo” xml onde o conteúdo tanto do XML quanto da chave são passados como tags no xml.
Porém o método ReceberLoteEventoCriptoGZIP tem como parâmetro um array de byte e não um XML. Assim, algumas dúvida:
– Esse XML com os dados criptografados deve também ser convertido em array de bytes ?
– Esse arquivo XML que contém os dados do lote criptografado (com até 100 eventos e 100 id’s correspondentes) também possui uma tag , então, para cada arquivo teríamos que criar um novo id identificando o lote ?
– Você comentou em algumas de suas postagens no fórum que também desenvolveu em C# a criptografia e geração do XML. Seria pedir muito que me enviasse o código para que pudesse comparar com o nosso e corrigir possíveis falhas ?
Obrigado!