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