none
Encriptacion RSA

    Question

  • Buenos días comunidad
              Estoy realizando un desarrollo en la cual debo enviar unos dato cifrados con RSA mediante clave X509 v3  gracias a la ayuda de la comunidad he podido cifrar con la clave publica (.der)y descifrar con la clave privada(incluida en el archivo .p12), pero en el proyecto me exigen y me aseguran que funciona en otros lenguajes de cifrar con la privada y descifrar con la publica, pero al intentar me arroja el error "Clave incorrecta" (supongo porque intenta descifrar con la clave privada)

    private void Cifrar_Click(object sender, EventArgs e)
            {
                //X509Certificate2 _Certificado = new X509Certificate2(@"c:\misdatos.der");
                //RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_Certificado.PublicKey.Key;
    
                X509Certificate2 _Certificado = new X509Certificate2(@"c:\misdatos.p12", "123456");           
                RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_Certificado.PrivateKey;
                
                byte[] DatosEnc = rsa.Encrypt(Encoding.UTF8.GetBytes(richTextBox1.Text), false);
                String DatosEncText = Convert.ToBase64String(DatosEnc);
                richTextBox2.Text = DatosEncText;
            }
    
            private void Descifrar_Click(object sender, EventArgs e)
            {
                //X509Certificate2 _Certificado = new X509Certificate2(@"c:\misdatos", "123456");           
                //RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_Certificado.PrivateKey;
    
                X509Certificate2 _Certificado = new X509Certificate2(@"c:\misdatos.der");
                RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_Certificado.PublicKey.Key;
    
                byte[] cipherbytes = Convert.FromBase64String(richTextBox2.Text);
                byte[] plainbytes = rsa.Decrypt(cipherbytes, false);
                System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                richTextBox3.Text = enc.GetString(plainbytes);
            }
    Espero que me puedan ayudar, desde ya muchas gracias
    Monday, August 24, 2009 2:55 PM

Answers

  • Hola.

    Deseas encriptar el hash o verificar la firma?, si fuera el caso de firma, aqui te dejo un ejemplo, de como seria la verificación. espero te sirva
                _llavePrivada = "<RSAKeyValue>" +
                    "<Modulus>sdJW9+HgwpOr1G/i+Dfg8iDQ7+weTnTS6kkoSkXPFY57IereZRw1sk8y4m2JfFgUlO+uS5F6xfV7fG6HCnjPQCfoQQd0A8SLIhBd1/TM6gFansUa76XnRbeS0wX2/cUDB78r0FLK2rNrmGg0bC3RXgZCeP20OgY3rGNnPF1X3fk=</Modulus>" +
                    "<Exponent>AQAB</Exponent>" +
                    "<P>38OBbzcfOmv4LeYjh5zfySoOHHFcH0pl2R6DM9xTUWKQVW8bixfQfbvObxh0+aeyn70LL86ZIAY7VnV8EaRh2Q==</P>" +
                    "<Q>y3B5CeegkgbrB8yHQahKNmR9jN5DtL27BIemOV56ArB8+kYwaDchXnSQcrnAnriSkJkj2OtFuOrngLxt7qepIQ==</Q>" +
                    "<DP>wwdi7C1uIXxznoXFF/EKOApYrD+9nGQ66wemMXBqijfPNzeVGSGTjdNANSJq6iJZFNMvSebXHctwsoXJspLE2Q==</DP>" +
                    "<DQ>xuRG8XAKg7lPvmgvM/mb1GGafUYvW1zCokMcN6ouDsMM7IICgWCktvuu3PrNXl+EqumNKl2Z5JeDjVCrCU/RAQ==</DQ>" +
                    "<InverseQ>OTgUT8ZFHkHLwv43TK87BAx7l+zC875AknC8dxfTZfXmvOcD42jWJNaSPpDSJxAxKdwsVgOMtgvZ1F39vwfuqA==</InverseQ>" +
                    "<D>ms1PMrqsLRfbZbQFtisHJCJXYhZ/B7QCDT2k2ovNTKneHdfWxdT6FgGGfcH4B4yyVjoV1OmQJReg6eFapE4ptO9hDW9JYUNw7/7zN/6GTiwCWbw/kXxWM0GYGsjBQ7Z949n3JiPtvfTpNRn9FCGi9Ij/DB89d/SBTKsHnG0uJwE=</D>" +
                    "</RSAKeyValue>";
                _llavePublica = "<RSAKeyValue>" +
                    "<Modulus>sdJW9+HgwpOr1G/i+Dfg8iDQ7+weTnTS6kkoSkXPFY57IereZRw1sk8y4m2JfFgUlO+uS5F6xfV7fG6HCnjPQCfoQQd0A8SLIhBd1/TM6gFansUa76XnRbeS0wX2/cUDB78r0FLK2rNrmGg0bC3RXgZCeP20OgY3rGNnPF1X3fk=</Modulus>" +
                    "<Exponent>AQAB</Exponent>" +
                    "</RSAKeyValue>";
    
                _miRSA = new ClaseRSA(_llavePrivada);
                byte[] bytesEncriptados = null;
                byte[] bytesTexto = System.Text.Encoding.UTF8.GetBytes(texto);
    
                RSACryptoServiceProvider objEncriptadorPublico = new RSACryptoServiceProvider();
                objEncriptadorPublico.FromXmlString(_llavePublica);
    
                //Firmar los datos, para esto se utiliza la llave privada
                objEncriptadorPublico.FromXmlString(_llavePrivada);
                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
                byte[] bytesFirmados = objEncriptadorPublico.SignData(bytesTexto, hasher);
                //Verificar la firma con la llave publica
                objEncriptadorPublico.FromXmlString(_llavePublica);
                bool verificado = objEncriptadorPublico.VerifyData(bytesTexto, hasher, bytesFirmados);
    
                //Encriptar los datos con la llave publica
                objEncriptadorPublico.FromXmlString(_llavePublica);
                bytesEncriptados = objEncriptadorPublico.Encrypt(bytesTexto, false);
                _textoEncriptado = Convert.ToBase64String(bytesEncriptados);
    
                //Desencriptar con la clase que contiene la llave privada, esta clase podria ser un servicio web
                byte[] bytesTextoEncriptado = Convert.FromBase64String(_textoEncriptado);
                _textoDesEncriptado = _miRSA.DesEncriptar(bytesTextoEncriptado);
    Saludos
    Oscar Angel Ramírez Figueroa
    Ingeniero en Computación
    DCE+Platino
    Monday, August 24, 2009 5:46 PM
  • Hola, solo utilize Sha1 para la firma, lo que puedes hacer es sacar el hash con ComputeHash de la clase Sha1, posteriormente encriptarlo y mandarlo al cliente, y este lo puede desencriptar y validar tanto hash como firma digital, el problema es qu para desencriptar se necesita la llave privada por que con la publica no he hallado la manera.

    Saludos


    Oscar Angel Ramírez Figueroa
    Ingeniero en Computación
    DCE+Platino
    Monday, August 24, 2009 8:18 PM
  • La verdad que me costo entender el funcionamiento, la idea es que deberas crear a traves de alguna herramienta gratuita 2 archivos:
    1. Archivo con extension .p12 que es un contenedor de tu clave privada con la cual firmaras y la clave publica que en teoria podrias verificar si esta correctamente firmada (yo no lo uso).
    2. Archivo con extension .cer que le entragaras a la otra persona que contendra la clave publica para que pueda verificar si se trata de tu firma (yo verifico con este mismo si lo firme correctamente).
     
    Por supuesto deberas tener el archivo .cer de la otra persona para poder verificar su firma.
     
     
     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Security.Cryptography;

    using System.Security.Cryptography.X509Certificates;

     

    namespace Encriptacion

    {

        class SHA1withRSA

        {

            X509Certificate2 _CertificadoPublico;

            X509Certificate2 _CertificadoMio;

     

            /// <summary>

            /// Archivo de certificado .P12 creado por mi

            /// </summary>

            public void CargarCertificadoMio(string pArchivo)

            {

                if (File.Exists(pArchivo))

                    _CertificadoPublico = new X509Certificate2(pArchivo);

            }

            /// <summary>

            /// Archivo de certificado .P12 creado por mi

            /// </summary>

            public void CargarCertificadoMio(X509Certificate2 pX509)

            {

                _CertificadoPublico = pX509;

            }

     

            /// <summary>

            /// Archivo de certificado .cer entregado por la otra persona para verificar la firma

            /// </summary>

            public void CargarCertificadoPublico(string pArchivo, string pClave)

            {

                if (File.Exists(pArchivo))

                    _CertificadoMio = new X509Certificate2(pArchivo, pClave);

            }

            /// <summary>

            /// Archivo de certificado .cer entregado por la otra persona para verificar la firma

            /// </summary>

            public void CargarCertificadoPublico(X509Certificate2 pX509)

            {

                _CertificadoMio = pX509;

            }

     

     

     

            public string FirmarSH1withRSA(string pDato)

            {

                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_CertificadoMio.PrivateKey;

                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();

                byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pDato), hasher);

                return Convert.ToBase64String(bytesFirmados);

            }

     

            public bool VerificarFirmaSH1withRSA(string pTexto, string pFirma)

            {

                byte[] bytesTexto = System.Text.Encoding.UTF8.GetBytes(pTexto);

                byte[] bytesFirmados = Convert.FromBase64String(pFirma);

     

                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_CertificadoPublico.PublicKey.Key;

                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();

                return RSA.VerifyData(bytesTexto, hasher, bytesFirmados);

            }

        }

    }

     

     

    Espero que les sea de ayuda.


    Me gustaría cambiar el mundo..., pero no me dan el código fuente
    Monday, August 02, 2010 9:17 PM

All replies

  • Hola.

    De hecho se cifra con la llave publica y se descifra con la llave privada, intentalo asi y me avisas.

    Saludos
    Oscar Angel Ramírez Figueroa
    Ingeniero en Computación
    DCE+Platino
    Monday, August 24, 2009 3:39 PM
  • Hola Oscar, de esa forma si funciona pero me exigen que sea al reves ya que se usa para firmar uno datos. segun me indicaron se hace un hash de lo datos y estos se cifran con RSA utilizado la clave privada (la firma a obtener es del tipo sha1withrsa).
    Buscando información me tope con la URL  http://www.slideshare.net/danitxu/introduccin-a-la-criptografia

    que dice :

                    Cifrado asimétrico

       * Encriptación:
           -Origen:encriptar mensaje con clave pública del receptor
           -destino:desencripta con clave privada del receptor
       * Firma:
           -Origen:encriptar hash de un mensaje con clave privada del emisor
           -Destino:desemcripta con la clave pública del emisor

    Monday, August 24, 2009 4:06 PM
  • hola

    la verdad no tengo mucha experincia en temas de cryptografia, peor por ahi pueda aportar algo de info

    a ver sie ste link ayuda:
    RSA Private Key Encryption


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Monday, August 24, 2009 4:53 PM
  • Hola.

    Deseas encriptar el hash o verificar la firma?, si fuera el caso de firma, aqui te dejo un ejemplo, de como seria la verificación. espero te sirva
                _llavePrivada = "<RSAKeyValue>" +
                    "<Modulus>sdJW9+HgwpOr1G/i+Dfg8iDQ7+weTnTS6kkoSkXPFY57IereZRw1sk8y4m2JfFgUlO+uS5F6xfV7fG6HCnjPQCfoQQd0A8SLIhBd1/TM6gFansUa76XnRbeS0wX2/cUDB78r0FLK2rNrmGg0bC3RXgZCeP20OgY3rGNnPF1X3fk=</Modulus>" +
                    "<Exponent>AQAB</Exponent>" +
                    "<P>38OBbzcfOmv4LeYjh5zfySoOHHFcH0pl2R6DM9xTUWKQVW8bixfQfbvObxh0+aeyn70LL86ZIAY7VnV8EaRh2Q==</P>" +
                    "<Q>y3B5CeegkgbrB8yHQahKNmR9jN5DtL27BIemOV56ArB8+kYwaDchXnSQcrnAnriSkJkj2OtFuOrngLxt7qepIQ==</Q>" +
                    "<DP>wwdi7C1uIXxznoXFF/EKOApYrD+9nGQ66wemMXBqijfPNzeVGSGTjdNANSJq6iJZFNMvSebXHctwsoXJspLE2Q==</DP>" +
                    "<DQ>xuRG8XAKg7lPvmgvM/mb1GGafUYvW1zCokMcN6ouDsMM7IICgWCktvuu3PrNXl+EqumNKl2Z5JeDjVCrCU/RAQ==</DQ>" +
                    "<InverseQ>OTgUT8ZFHkHLwv43TK87BAx7l+zC875AknC8dxfTZfXmvOcD42jWJNaSPpDSJxAxKdwsVgOMtgvZ1F39vwfuqA==</InverseQ>" +
                    "<D>ms1PMrqsLRfbZbQFtisHJCJXYhZ/B7QCDT2k2ovNTKneHdfWxdT6FgGGfcH4B4yyVjoV1OmQJReg6eFapE4ptO9hDW9JYUNw7/7zN/6GTiwCWbw/kXxWM0GYGsjBQ7Z949n3JiPtvfTpNRn9FCGi9Ij/DB89d/SBTKsHnG0uJwE=</D>" +
                    "</RSAKeyValue>";
                _llavePublica = "<RSAKeyValue>" +
                    "<Modulus>sdJW9+HgwpOr1G/i+Dfg8iDQ7+weTnTS6kkoSkXPFY57IereZRw1sk8y4m2JfFgUlO+uS5F6xfV7fG6HCnjPQCfoQQd0A8SLIhBd1/TM6gFansUa76XnRbeS0wX2/cUDB78r0FLK2rNrmGg0bC3RXgZCeP20OgY3rGNnPF1X3fk=</Modulus>" +
                    "<Exponent>AQAB</Exponent>" +
                    "</RSAKeyValue>";
    
                _miRSA = new ClaseRSA(_llavePrivada);
                byte[] bytesEncriptados = null;
                byte[] bytesTexto = System.Text.Encoding.UTF8.GetBytes(texto);
    
                RSACryptoServiceProvider objEncriptadorPublico = new RSACryptoServiceProvider();
                objEncriptadorPublico.FromXmlString(_llavePublica);
    
                //Firmar los datos, para esto se utiliza la llave privada
                objEncriptadorPublico.FromXmlString(_llavePrivada);
                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
                byte[] bytesFirmados = objEncriptadorPublico.SignData(bytesTexto, hasher);
                //Verificar la firma con la llave publica
                objEncriptadorPublico.FromXmlString(_llavePublica);
                bool verificado = objEncriptadorPublico.VerifyData(bytesTexto, hasher, bytesFirmados);
    
                //Encriptar los datos con la llave publica
                objEncriptadorPublico.FromXmlString(_llavePublica);
                bytesEncriptados = objEncriptadorPublico.Encrypt(bytesTexto, false);
                _textoEncriptado = Convert.ToBase64String(bytesEncriptados);
    
                //Desencriptar con la clase que contiene la llave privada, esta clase podria ser un servicio web
                byte[] bytesTextoEncriptado = Convert.FromBase64String(_textoEncriptado);
                _textoDesEncriptado = _miRSA.DesEncriptar(bytesTextoEncriptado);
    Saludos
    Oscar Angel Ramírez Figueroa
    Ingeniero en Computación
    DCE+Platino
    Monday, August 24, 2009 5:46 PM
  • Si Oscar necesito firmar un documento y verificar también la firma. ¿El código que mencionaste corresponde a una firma del tipo sh1withrsa?
    Monday, August 24, 2009 6:43 PM
  • Hola, solo utilize Sha1 para la firma, lo que puedes hacer es sacar el hash con ComputeHash de la clase Sha1, posteriormente encriptarlo y mandarlo al cliente, y este lo puede desencriptar y validar tanto hash como firma digital, el problema es qu para desencriptar se necesita la llave privada por que con la publica no he hallado la manera.

    Saludos


    Oscar Angel Ramírez Figueroa
    Ingeniero en Computación
    DCE+Platino
    Monday, August 24, 2009 8:18 PM
  • Buenos días comunidad
              Estoy realizando un desarrollo en la cual debo enviar unos dato cifrados con RSA mediante clave X509 v3  gracias a la ayuda de la comunidad he podido cifrar con la clave publica (.der)y descifrar con la clave privada(incluida en el archivo .p12), pero en el proyecto me exigen y me aseguran que funciona en otros lenguajes de cifrar con la privada y descifrar con la publica, pero al intentar me arroja el error "Clave incorrecta" (supongo porque intenta descifrar con la clave privada)
    Espero que me puedan ayudar, desde ya muchas gracias

    pues segun entiendo el que te aseguro eso esta un poco sacado de onda...

    que gano yo cifrando una con una llave privada y decifrando con la publica ???

    si eso fuera asi cualquiera podria decifrar lo encriptado y eso no tiene sentido de ninguna manera...

    la publica te sirve para cifrar datos y la privada para decifrarlos, pues cualquiera podria cifrar pero solo el indicado ( el que tiene la privada ) puede decifrar... eso si tiene sentido..

    Convendria que le digas a esas personas que deben repasar los principios de encripción simétrica y asimétrica:

    Tal ves sea yo el equivocado, pues no me las se todas, pero hasta donde aprendi en la universidad y a lo largo de algunos años de experiencia:

    http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica
    ---------

    Criptografía asimétrica

    De Wikipedia, la enciclopedia libre

    La criptografía asimétrica es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona a la que se ha enviado el mensaje. Una clave es pública y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Además, los métodos criptográficos garantizan que esa pareja de claves sólo se puede generar una vez, de modo que se puede asumir que no es posible que dos personas hayan obtenido casualmente la misma pareja de claves.

     

     









    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    Wednesday, August 26, 2009 8:33 PM
    Moderator
  • hola

    has podido analizar el link que envie ?
    RSA Private Key Encryption

    alli plantea un escenario que por ahi parece interesante:

    Scenario A

    Suppose Alice wants to send a message to Bob (for his eyes only!). She can encrypt the message using the RSA algorithm with Bob's Public key, which is not a secret (that's why they call it Public…). Once the message is encrypted, nobody can decrypt it, except the one holding the matching Private Key (that is Bob).

    Scenario B

    The reverse is also true: if Alice would encrypt the message using her own Private Key , Bob (and Eve, and everyone who can access this "encrypted" message) can decrypt it using Alice's Public Key. So, if everybody can decrypt it, what's the point in encrypting the message with a Private Key in the first place? Well, there is a point if Bob wants to make sure that the message has been written by Alice and not by someone else (Eve?).

     

    como veras como una validacion en envios de mail para saber si la persona que envia el mensaje es quien dice ser, parece ser util encriptar con la privada.

    es algo puntual es uso, pero interesante

    creo que PGP (Pretty Good Privacy) utilzia este concepto para elt ema de mail, para detectar que el mensaje provien de la personaquien dice que lo envia, o eso al menos entendi

    Conceptos de PGP

    especialmente donde dice

    • La pública es para que los demás puedan comprobar nuestra firma y enviarnos mensajes cifrados, esta firma debe darse a conocer a los demás. 
    • La clave privada es secreta y no debe dejarse absolutamente a nadie. Con la clave privada se firman nuestros mensajes y se desencriptan los que nos envían, por lo que es de uso totalmente personal.

    Sino entiedno mal hay como un doble juego, si alguien envia con la publica es para mantener el secreto, ya que solo uno que tiene la privada podra leerlo.
    Pero al reves tambien es valida no para mantenr secreto, sino simplemente para que el destinatario sepa, y pueda corroborar que es uno el que envio ese mensaje.

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Thursday, August 27, 2009 4:22 AM
  • Buenos días comunidad aparentemente la respuesta correcta es la que indico Oscar Angel Ramírez digo aparentemente ya que debo esperar a que reparen el web service a donde debo conectarme, lo que puedo asegurar es que se trata de la firma sh1withrsa ya que pude validar paquetes anteriores que tengo logueados.

    En cuanto levanten el servicio les respondo, desde ya muchas gracias a todos por guiarme.
    Monday, August 31, 2009 12:23 PM
  • Buenos días comunidad
              Estoy realizando un desarrollo en la cual debo enviar unos dato cifrados con RSA mediante clave X509 v3  gracias a la ayuda de la comunidad he podido cifrar con la clave publica (.der)y descifrar con la clave privada(incluida en el archivo .p12), pero en el proyecto me exigen y me aseguran que funciona en otros lenguajes de cifrar con la privada y descifrar con la publica, pero al intentar me arroja el error "Clave incorrecta" (supongo porque intenta descifrar con la clave privada)
    Espero que me puedan ayudar, desde ya muchas gracias

    pues segun entiendo el que te aseguro eso esta un poco sacado de onda...

    que gano yo cifrando una con una llave privada y decifrando con la publica ???

    si eso fuera asi cualquiera podria decifrar lo encriptado y eso no tiene sentido de ninguna manera...

    la publica te sirve para cifrar datos y la privada para decifrarlos, pues cualquiera podria cifrar pero solo el indicado ( el que tiene la privada ) puede decifrar... eso si tiene sentido..

    Convendria que le digas a esas personas que deben repasar los principios de encripción simétrica y asimétrica:

    Tal ves sea yo el equivocado, pues no me las se todas, pero hasta donde aprendi en la universidad y a lo largo de algunos años de experiencia:

    http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica
    ---------

    Criptografía asimétrica

    De Wikipedia, la enciclopedia libre

    La criptografía asimétrica es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona a la que se ha enviado el mensaje. Una clave es pública y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Además, los métodos criptográficos garantizan que esa pareja de claves sólo se puede generar una vez, de modo que se puede asumir que no es posible que dos personas hayan obtenido casualmente la misma pareja de claves.

     

     









    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    que tal Juan Carlos, como bien nos documenta Leandro y nos aclara Walter, este precidmiento de "cifrar" con la llave privada y decifrar con la publica, se usa para "firmar" un documento, donde lo importante es certificar que efectivamente el documento viene del emisor, esto es utilizado comunmente para validar que documentos oficiales provengan efectivamente de la entidad que los emite (no sean falsificaciones) , Gracias leandro por tu link, por cierto walter, funciono??

    Wednesday, September 09, 2009 12:50 AM
  • que tal Walter buen dia, oie tengo una duda, espero me puedas ayudar, yo tengo la clave publica en un archivo .cer y la privada en un archivo .key y al igual que tu, ocupo realizar la encriptacion o firmado con la privada, el problema es que cuado se ejecuta el codigo (
    X509Certificate2 llavePrivada = new
     X509Certificate2(@"c:\miarchivo.key"
    , "abcd1234"
    );           
    RSACryptoServiceProvider myRsa = (RSACryptoServiceProvider)llavePrivada.PrivateKey
    ) me marca el error "Objeto no encontrado", en la primera linea y obviamente ya verifique la existencia del archivo key en la ruta (ya tambien lo puse en la raiz) tambien verifique que la contraseña es la correcta, y hasta le puse el archivo .cer en la misma ruta por si las dudas, otro dato curioso es que si cambio el archivo key por el cer, si me lo lee, pero al momento de querer obtener la clave privada me marca error, (obviamente por que el cer no contiene la clave privada)
    no se donde puede estar mi error, o si tu tubiste el mismo problema, aaa y el archivo key esta codificado en RSA formato Der estandar pkcs8
    gracias


    Wednesday, September 09, 2009 4:17 PM
  • Buenos días comunidad hasta el momento lamentablemente el webservice en donde debo enviar los datos firmados sigue  sin operar.

    Leo te comento que yo pase exactamente por el mismo problema, aparentemente segun mis pruebas RSACryptoServiceProvider solo acepta .DER, .CER  (que contiene solo la clave pública) y .P12(que contiene clave privada y publica protegido con una contraseña) con lo cual debes convertir el .key junto con el .der o cer tuyos a en un .p12
    yo utilise OpenSsl
    Te paso un pequeño manual

    Crear Entidad certificadora

    openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -days 3650 -out cacert.pem

    Con este comando creamos un CA para certificados X509 con algoritmo de encriptaci¢n rsa de 2048 bytes. Con el -keyout le indicamos que la clave privada de nuestra CA se almacene en el fichero cakey.pem y la clave publica -out en el cacert.pem.
    Seguidamente nos pedir  un password para nuestra CA, tambi‚n nos pedir  una serie de datos por ejemplo pa¡s, nombre de empresa, que nos identifica como CA.
    Observar que le he a¤adido el par metro -days con 3650, de esta manera indicamos que la CA no expire en 10 a¤os. Lo ficheros generados son cacert.pem y cakey.pem

    Crear clave privada

    openssl genrsa -des3 -passout pass:mipassword-out client-priv.pem 2048

    Con esto generamos la clave privada la cual tendr  un algoritmo de cifrado triple des (-des3) de 2048 y se almacenara en el fichero (-out) client-priv.pem y con el comando -passout pass: indicamos la passphrase para nuestra clave privada


    Crear clave publica

    Creamos primero una petici¢n
    openssl req -new -key client-priv.pem -passin pass:mipassword-subj "/CN=cn/OU=ou/O=oC=AR/SN=465454" -out petic-cert-client.pem

    Creamos un archivo  config2.txt con el contenido
    basicConstraints = critical,CA:FALSE
    asi le indicamos que cumpla con el x509v3 y con la RFC 3280
    Y ahora creamos la clave publica valida por 60 d¡as

    openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-cert-client.pem -set_serial 3 -days 60 -extfile config2.txt -sha1 -out client-cert.pem


    Crear archivo p12

    openssl pkcs12 -export -in client-cert.pem -inkey client-priv.pem -certfile cacert.pem -out cert-pck12.p12

    Convertir una clave publica .PEM a .DER

    x509 -in client-cert.pem -inform PEM -out client-cert.der -outform DER

    y el codigo utlizado es:

    private string FirmarSH1withRSA(string pDato)
            {
                /*
                 * El archivo P12 contiene la clave privada y publica(se usa este porque no se puede leer un .key)
                 * es necesario tener la contraseña del .p12 para poder leer ambas claves.
                 * Ojo no confundir con la contraseña usada para rear la clave privada con la contraseña para generar .p12
                 */
                X509Certificate2 _MiCertificado = new X509Certificate2(@"C:\Micertificado.p12", "MiContraseña");
                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_MiCertificado.PrivateKey;
                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
                byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pDato), hasher);
                return Convert.ToBase64String(bytesFirmados);
            }
    
            private bool VerificarFirmaSH1withRSA(string pDato, string pFirma)
            {
                /*
                 * Se puede leer tanto un .cer o .der para obtener la clave publica(solo contienen claves publicas).
                 * No se necesita clave para leer el certificado
                 */
                X509Certificate2 _ClavePublica = new X509Certificate2(@"C:\CertificadoCliente.cer");
                byte[] bytesTexto = System.Text.Encoding.UTF8.GetBytes(pDato);
                byte[] bytesFirmados = Convert.FromBase64String(pFirma);
    
                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_ClavePublica.PublicKey.Key;
                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
                return RSA.VerifyData(bytesTexto, hasher, bytesFirmados);
            }

    Espero que alguien lo pueda probar para indicar si funciona

    Friday, September 11, 2009 2:08 PM
  • gracias walter, de echo tube que convertir el .key en xml con el openssl, y utilice el .cer tal cual (xml, como llave privada y .cer como publica), con el ejemplo que propone Oscar, y si, si me funciono para la firma, pero no decodifica, solo confirma la veracidad de la firma, de echo, si cambias un dato de la cadena que firmaste, (en un proceso por separado) y corres la comprobacion de la firma, el resultado es false, y haylogica en esto, dado que realmente en este proceso  el "mensaje" puede ser leido por "varias personas" pero lo que se requiere es "confirmar" mediante un sello, la "veracidad de la fuente y autenticidad del mensaje"
    saludos!!!
    walter solo una duda, este procedimiento lo requieres para la generacion de cierto documento fiscal que se aplica en mexico?
    Wednesday, September 23, 2009 12:00 AM
  • Hola Leo, yo soy novato en este aspecto de la encriptacion, y queria saber si funciono tu manera de firmar la cadena con la llave privada?? porque fijate que yo ando haciendo eso mismo, pero me esta causando algo de ruido eso mismo de la.key no se como hacer que la firme, espero que me puedas ayudar y te mando saludos
    Tuesday, December 22, 2009 2:43 AM
  • La verdad que me costo entender el funcionamiento, la idea es que deberas crear a traves de alguna herramienta gratuita 2 archivos:
    1. Archivo con extension .p12 que es un contenedor de tu clave privada con la cual firmaras y la clave publica que en teoria podrias verificar si esta correctamente firmada (yo no lo uso).
    2. Archivo con extension .cer que le entragaras a la otra persona que contendra la clave publica para que pueda verificar si se trata de tu firma (yo verifico con este mismo si lo firme correctamente).
     
    Por supuesto deberas tener el archivo .cer de la otra persona para poder verificar su firma.
     
     
     

    using System;

    using System.Collections.Generic;

    using System.Text;

    using System.Security.Cryptography;

    using System.Security.Cryptography.X509Certificates;

     

    namespace Encriptacion

    {

        class SHA1withRSA

        {

            X509Certificate2 _CertificadoPublico;

            X509Certificate2 _CertificadoMio;

     

            /// <summary>

            /// Archivo de certificado .P12 creado por mi

            /// </summary>

            public void CargarCertificadoMio(string pArchivo)

            {

                if (File.Exists(pArchivo))

                    _CertificadoPublico = new X509Certificate2(pArchivo);

            }

            /// <summary>

            /// Archivo de certificado .P12 creado por mi

            /// </summary>

            public void CargarCertificadoMio(X509Certificate2 pX509)

            {

                _CertificadoPublico = pX509;

            }

     

            /// <summary>

            /// Archivo de certificado .cer entregado por la otra persona para verificar la firma

            /// </summary>

            public void CargarCertificadoPublico(string pArchivo, string pClave)

            {

                if (File.Exists(pArchivo))

                    _CertificadoMio = new X509Certificate2(pArchivo, pClave);

            }

            /// <summary>

            /// Archivo de certificado .cer entregado por la otra persona para verificar la firma

            /// </summary>

            public void CargarCertificadoPublico(X509Certificate2 pX509)

            {

                _CertificadoMio = pX509;

            }

     

     

     

            public string FirmarSH1withRSA(string pDato)

            {

                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_CertificadoMio.PrivateKey;

                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();

                byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pDato), hasher);

                return Convert.ToBase64String(bytesFirmados);

            }

     

            public bool VerificarFirmaSH1withRSA(string pTexto, string pFirma)

            {

                byte[] bytesTexto = System.Text.Encoding.UTF8.GetBytes(pTexto);

                byte[] bytesFirmados = Convert.FromBase64String(pFirma);

     

                RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_CertificadoPublico.PublicKey.Key;

                SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();

                return RSA.VerifyData(bytesTexto, hasher, bytesFirmados);

            }

        }

    }

     

     

    Espero que les sea de ayuda.


    Me gustaría cambiar el mundo..., pero no me dan el código fuente
    Monday, August 02, 2010 9:17 PM
  • gracias walter, de echo tube que convertir el .key en xml con el openssl, y utilice el .cer tal cual (xml, como llave privada y .cer como publica), con el ejemplo que propone Oscar, y si, si me funciono para la firma, pero no decodifica, solo confirma la veracidad de la firma, de echo, si cambias un dato de la cadena que firmaste, (en un proceso por separado) y corres la comprobacion de la firma, el resultado es false, y haylogica en esto, dado que realmente en este proceso  el "mensaje" puede ser leido por "varias personas" pero lo que se requiere es "confirmar" mediante un sello, la "veracidad de la fuente y autenticidad del mensaje"
    saludos!!!
    walter solo una duda, este procedimiento lo requieres para la generacion de cierto documento fiscal que se aplica en mexico?


    Hola que tal, oye tengo una pregunta, cómo conseguiste convertir el .key en .xml? bueno ya sé que fué con ayuda del openssl, pero fué una conversión explícita o a través de varios procesos?

    Gracias

    Tuesday, September 07, 2010 5:08 PM
  • se puede decir que fue una conversion explicita, ya que este programa en la linea de comandos te permite leer el key y te muestra su estructura xml

    Tuesday, September 07, 2010 5:58 PM
  • se puede decir que fue una conversion explicita, ya que este programa en la linea de comandos te permite leer el key y te muestra su estructura xml

    Hola que tal,  cual es la sintaxis del openssl con la que hiciste esto?
    Wednesday, December 08, 2010 12:01 AM