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