public byte[] Sign(AsymmetricKeyParameter privatekey, byte[] data) { Org.BouncyCastle.Crypto.ISigner signer = SignerUtilities.GetSigner(Algorithm); signer.Init(true, privatekey); signer.BlockUpdate(data, 0, data.Length); return(signer.GenerateSignature()); }
/// <summary> /// Retorna el sello digital para el certificado y firmando con la llave. /// </summary> /// <param name="rutaLlave"></param> /// <param name="clavePrivada"></param> /// <param name="cadenaOriginal"></param> /// <returns></returns> public string GetSelloDigital(ref string error, string rutaLlave, string clavePrivada, string cadenaOriginal) { try { byte[] ArrayKey = File.ReadAllBytes(rutaLlave); // Convertimos el archivo anterior a byte //1) Desencriptar la llave privada, el primer parámetro es la contraseña de llave privada y el segundo es la llave privada en formato binario. Org.BouncyCastle.Crypto.AsymmetricKeyParameter asp = Org.BouncyCastle.Security.PrivateKeyFactory.DecryptKey(clavePrivada.ToCharArray(), ArrayKey); //2) Convertir a parámetros de RSA Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters key = (Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)asp; //3) Crear el firmador con SHA1 Org.BouncyCastle.Crypto.ISigner sig = Org.BouncyCastle.Security.SignerUtilities.GetSigner("SHA-256withRSA"); //La siguiente linea es para generar el sello para la nueva versión de CFDI 3.3 // Org.BouncyCastle.Crypto.ISigner sig = Org.BouncyCastle.Security.SignerUtilities.GetSigner("SHA-256withRSA"); //4) Inicializar el firmador con la llave privada sig.Init(true, key); // 5) Pasar la cadena original a formato binario byte[] bytes = Encoding.UTF8.GetBytes(cadenaOriginal); // 6) Encriptar sig.BlockUpdate(bytes, 0, bytes.Length); byte[] bytesFirmados = sig.GenerateSignature(); // 7) Finalmente obtenemos el sello String sello = Convert.ToBase64String(bytesFirmados); return(sello); } catch (Exception e) { _logger.EscribirError(e.ToString()); error = "Problemas al generar xml para el timbrado, favor revisar clave o certificados."; return(""); } }
public string SignString(string contents, string privateKey) { var curve = SecNamedCurves.GetByName("secp256k1"); var domain = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H); var keyParameters = new ECPrivateKeyParameters(new BigInteger(privateKey, 16), domain); Org.BouncyCastle.Crypto.ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA"); signer.Init(true, keyParameters); signer.BlockUpdate(Encoding.ASCII.GetBytes(contents), 0, contents.Length); var signature = signer.GenerateSignature(); return(Base58Encoding.Encode(signature)); }