![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
Pasar de C# a Delphi
Saludos Compañeros.
No conozco de C# y hacienda efectuo este ejemplo para firmar xml de facturacion electronica. Me pueden ayudar a pasarlo a Delphi ? Desde ya muchas gracias. Cita:
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Security.Cryptography;
namespace DgiEncriptarXml {
class Program {
/ <summary>
/ Lee y escribe todos los archivos desde el directorio de la aplicación.
/ </summary>
/ <param name="args"></param>
static void Main(string[] args) {
const string NOMBRE_CLAVE = "CERT_DGI_EFACTURA";
/ Se carga el documento a cifrar
var xmlDoc = CargarXml(@"EnvioCfe_net_sin_encriptar.xml");
/ Se carga el certificado que se va a utilizar.
/ Se utiliza la clave pública para cifrar y la clave privada para descifrar
var cert = CargarCertificado("client.p12", "secreto");
/ Se selecciona el nodo del documento que se cifrará
var xmlNM = new XmlNamespaceManager(xmlDoc.NameTable);
xmlNM.AddNamespace("ns0", "http://cfe.dgi.gub.uy");
var elm =
xmlDoc.SelectSingleNode("/ns0:EnvioCFE/ns0:CFE/ns0:eFact/ns0:Compl_Fiscal/ns0:Compl_Fiscal_Data", xmlNM) as XmlElement;
/Encriptamos
EncriptarXml(elm, cert, NOMBRE_CLAVE);
/Guardo el documento cifrado
xmlDoc.Save("EnvioCfe_net_encriptado.xml");
/Cargo nuevamente el documento cifrado
xmlDoc = CargarXml("EnvioCfe_net_sin_encriptar.xml");
/ Se descifra el documento
DesencriptarDocumento(xmlDoc, cert, NOMBRE_CLAVE);
/Guardo el documento descifrado
xmlDoc.Save("EnvioCfe_net_desencriptado.xml");
}
/ <summary>
/ Carga un certificado desde un almacén tipo #PKCS12
/ El certificado podría cargarse desde otros lugares,
/ por ejemplo, el almacén de windows
/ </summary>
/ <param name="path">Camino al archivo</param>
/ <param name="contrasenia">Contraseña del almacén</param>
/ <returns></returns>
private static X509Certificate2 CargarCertificado(string path, string contrasenia) {
return new X509Certificate2(path, contrasenia, X509KeyStorageFlags.Exportable);
}
/ <summary>
/ Carga el documento xml que contiene el nodo a cifrar
/ </summary>
/ <param name="path">Camino al archivo</param>
/ <returns></returns>
private static XmlDocument CargarXml(string path) {
var xmldoc = new XmlDocument();
xmldoc.PreserveWhitespace = false;
xmldoc.Load(path);
return xmldoc;
}
/ <summary>
/ Cifra el nodo utilizando la clave pública del certificado suministrado.
/ </summary>
/ <param name="nodoParaEncriptar">Elemento para cifrar</param>
/ <param name="cert">Certificado </param>
/ <param name="nombreClave">Nombre para la clave</param>
private static void EncriptarXml(XmlElement nodoParaEncriptar, X509Certificate2 cert, string
nombreClave) {
/ Se crea una nueva clave TripleDES.
TripleDESCryptoServiceProvider tDESkey = new TripleDESCryptoServiceProvider();
/ Se crea una nueva instancia de EncryptedXml y la uso para encriptar el elemento con la clave simétrica.
EncryptedXml eXml = new EncryptedXml();
byte[] encryptedElement = eXml.EncryptData(nodoParaEncriptar, tDESkey, false);
/ Se construye el objeto EncryptedData y se carga la información de cifrado deseada
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncTripleDESUrl);
var alg = (RSACryptoServiceProvider)cert.PublicKey.Key;
/ Se cifra la clave simétrica.
EncryptedKey ek = new EncryptedKey();
byte[] encryptedKey = EncryptedXml.EncryptKey(tDESkey.Key, alg, false);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url);
/Agrega la clave cifrada al objeto EncriptedData
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
/ Asigna el Elemento KeyInfoName para especificar el nombre de la clave RSA
KeyInfoName kin = new KeyInfoName();
kin.Value = nombreClave;
/ Agrega el KeyInfoName al objeto encriptado
ek.KeyInfo.AddClause(kin);
edElement.CipherData.CipherValue = encryptedElement;
EncryptedXml.ReplaceElement(nodoParaEncriptar, edElement, false);
}
/ <summary>
/ Descifra el documento utilizando la clave privada del certificado suministrado
/ </summary>
/ <param name="xmlDoc">Documento a descifrar</param>
/ <param name="cert">Certificado a utilizar</param>
/ <param name="nombreClave">Nombre de la clave simétrica</param>
private static void DesencriptarDocumento(XmlDocument xmlDoc, X509Certificate2 cert, string
nombreClave) {
EncryptedXml exml = new EncryptedXml(xmlDoc);
/ Agrega el diccionario clave-nombre
/ Este método sólo puede descifrar documentos
/ que contengan la clave especificada
var privateKey =(RSACryptoServiceProvider)cert.PrivateKey;
exml.AddKeyNameMapping(nombreClave, privateKey);
/ Descifrar el elemento.
exml.DecryptDocument();
}
}
}
__________________
Gasal. Última edición por dec fecha: 22-12-2019 a las 15:51:58. Razón: Poner etiquetas QUOTE Y CODE |
|
#2
|
||||
|
||||
|
Hola gasal.
No sé a qué país te refieres con hacienda, pero con tu mensaje recordé un caso similar que puedes consultar a través de este par de enlaces: http://rescatandoadelphi.blogspot.co...go-delphi.html http://www.clubdelphi.com/foros/showthread.php?t=77783 No te garantizo que te lleven a solucionarlo pronto, pero quizá te sean de alguna utilidad. Un saludo. Al González. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Pasar Variables a Delphi | marcial | HTML, Javascript y otros | 8 | 19-09-2013 10:10:53 |
| Pasar de delphi 7 a Delphi 2006 (problemas con VCL) | jmlifi | .NET | 8 | 24-01-2006 15:51:30 |
| Pasar de Excel a Delphi | CamiloU | Conexión con bases de datos | 2 | 05-01-2006 14:03:24 |
| Pasar una aplicación de EVB A delphi.net | User_Baja_2 | Varios | 0 | 14-05-2005 12:59:57 |
| Pasar delphi a castellano | egarralaga | Varios | 4 | 12-10-2004 22:50:47 |
|