//Org.BouncyCastle.Crypto.ISigner sigBouncyCastle1 = Org.BouncyCastle.Security.SignerUtilities.GetSigner("MD5WithRSAEncryption");
Org.BouncyCastle.Crypto.ISigner sigBouncyCastle1 = Org.BouncyCastle.Security.SignerUtilities.GetSigner("SHA1WithRSA");
sigBouncyCastle1.Init(true, keyPair.Private);
sigBouncyCastle1.BlockUpdate(plaintext, 0, plaintext.Length);
byte[] signature = sigBouncyCastle1.GenerateSignature();
string EncriptBouncyCastle1 = Convert.ToBase64String(signature);
txt_hash_asp_net.Text = EncriptBouncyCastle1;
Ahora pues para validar el sello contra la cadena original (con nuestra llavesiña publica o certificao) conforme a lo que hace ValidaCFD y El del sat con bouncycastle ahi está la función en C# aunque en java sun hay funciones en internet que relativamente es casi lo mismo con c# aunque se utiliza el pemwriter, aprovechen c-sharperos y vbneteros y asperos:
//Retorna verdadero si el sello es correcto
//DirKeyPublic es el pem del certificado
//Sello son las letras o codificacion sha1
//Cadena origina es la cadena original armada tal cual
public bool VerificaSello(string DirKeyPublic, string Sello, string CadOrig)
{
UTF8Encoding UTF8 = new UTF8Encoding();
//Leo la key public o conocido como certificao
StreamReader keyPublic = new StreamReader(DirKeyPublic);
PemReader pemcertnina = new PemReader(keyPublic); //(Leo en formato pem)
//convierto a el cer a X509Certificado
X509Certificate Cert = (X509Certificate)pemcertnina.ReadObject();
//Convierto de base64 el sello a array bytes
byte[] byteSello = Convert.FromBase64String(Sello);
//Convierto la cadena original a utf8
byte[] CadenaOriginal = UTF8.GetBytes(CadOrig);
//le digo ke va a ser de sha1conrsa sino sería MD5WithRSAEncryption pa los anteriores (firmante)
ISigner Firmador = SignerUtilities.GetSigner("SHA1WithRSA");
//agrego la clave publica ke viene siendo el certificado
Firmador.Init(false, Cert.GetPublicKey());
//paso la cadena original
Firmador.BlockUpdate(CadenaOriginal, 0, CadenaOriginal.Length);
//Valido que este bien
return Firmador.VerifySignature(byteSello);
}
Saludines y denle en me gusta o no me gusta ja ja ja
Se aceptan comentarios malos y criticas destructivas!! o movimiento a programación

Lo de abajo es para generar el sello, tomado de foros del web pero ya bien hechecito pero aun falta kitar el endcertificate por si se escapa a veces pero eso se los dejo de tarea aunque no es muy común
public string Sello(string DirKey, string CadenaOriginal)
{
UTF8Encoding UTF8 = new UTF8Encoding();
StreamReader readFile = new StreamReader(DirKey);
byte[] plaintext = UTF8.GetBytes(CadenaOriginal);
PemReader Ocertnina = new PemReader(readFile);
AsymmetricCipherKeyPair o = Ocertnina.ReadObject() as AsymmetricCipherKeyPair;
ISigner sig = SignerUtilities.GetSigner("MD5WithRSAEncryption");
sig.Init(true, o.Private);
sig.BlockUpdate(plaintext, 0, plaintext.Length);
byte[] signature = sig.GenerateSignature();
string Sello = Convert.ToBase64String(signature);
readFile.Close();
readFile = null;
return Sello;
}
ESto es para el numero de certificado de pilón, ya es algo de investigación a lo mejor loque les dejo aquí tambien sacado de foros del web
public string NumeroCertificado(string Dir) //dir del .pem del .cer
{
//*****************************certificado
//Read Public Kei
TextReader trCer = new StreamReader(Dir);
PemReader rdCernina = new PemReader(trCer);
X509Certificate Cert = (X509Certificate)rdCernina.ReadObject();
Org.BouncyCastle.Crypto.AsymmetricKeyParameter pk = Cert.GetPublicKey();
byte[] nSerie = Cert.SerialNumber.ToByteArray();
string nCertificado = Encoding.ASCII.GetString(nSerie);
Cert = null;
trCer.Close();
rdCer.Reader.Close();
return nCertificado;
}
P.D. dejo de tarea los imports o usings ya que pues algo tienen que hacer no?
y pues aki andamos!!