Ver Mensaje Individual
  #292 (permalink)  
Antiguo 10/12/2010, 14:05
ccsh23
 
Fecha de Ingreso: diciembre-2010
Mensajes: 4
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Factura electroncia sat mexico

Hola a todos, realmente me ayudó mucho leer este foro, asi que tomando el códgo y consejos que publicaron en esta sección, hice algunas adaptacions y por fin puedo sellar una factura en c# sin necesidad del openssl. este es el código que usé:

Código:
public static string ObtenerSelloDigital(string cadenaOriginal, string rutaLlavePrivada,string password)
        {
            SecureString passwordSeguro = new SecureString();
            passwordSeguro.Clear();
            foreach (char c in password.ToCharArray())
                passwordSeguro.AppendChar(c);
            byte[] llavePrivadaBytes = System.IO.File.ReadAllBytes(rutaLlavePrivada);
            RSACryptoServiceProvider rsa = Opensslkey.DecodeEncryptedPrivateKeyInfo(llavePrivadaBytes, passwordSeguro);
            MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
            byte[] bytesFirmados = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(cadenaOriginal), hasher);
            string selloDigital = Convert.ToBase64String(bytesFirmados);
            return selloDigital;
        }
después utilicé la clase opensslkey.cs (publicada anteriormente) y modifiqué el método DecodeEncryptedPrivateKeyInfo para que aceptara dos argumentos, y dentro de el lo que hice fue sustituir esto:

Código:
SecureString secpswd = GetSecPswd("Enter password for Encrypted PKCS #8 ==>");
por esto:

Código:
SecureString secpswd = password;
                    pkcs8 = DecryptPBDK2(encryptedpkcs8, salt, IV, secpswd, iterations);
y finalmente para evitar conflictos si en algun otro lado de la clase se mandaba a llamar este método, lo que hice fue crear uno que tomara un solo argumento, similar al original:

Código:
public static RSACryptoServiceProvider DecodeEncryptedPrivateKeyInfo(byte[] encpkcs8)
            {
                 SecureString secpswd = GetSecPswd("Enter password for Encrypted PKCS #8 ==>");
                 return DecodeEncryptedPrivateKeyInfo(encpkcs8,secpswd);
            }
Y con esto queda, espero que les sirva, saludos