public static bool VerificarFirmaElectronica(Punto publicKey, byte[] message, byte[] signature) { var parsed = ASN1_Generator.ASN1_Generator.Parse(signature); var r = ((ASN1_Integer)((ASN1_Sequence)parsed .Elements[0]) .content[0]) .Value; var s = ((ASN1_Integer)((ASN1_Sequence)parsed .Elements[0]) .content[1]) .Value; if (!(0 < r && r < Params.n)) { return(false); } if (!(0 < s && s < Params.n)) { return(false); } var eHash = FirmaElectronica.ObtenerHash(message); var e = new BigInteger(eHash); if (e.Sign == -1) { e = BigInteger.Negate(e); } var w = Arithmetic.Inversion_ExtendedEuclidean(s, Params.n); var u1 = Arithmetic.Mod(e * w, Params.n); var u2 = Arithmetic.Mod(r * w, Params.n); var X = u1 * Params.G + u2 * publicKey; if (X.EsInfinito || X.EsCero) { return(false); } var v = Arithmetic.Mod(X.x, Params.n); if (v == r) { return(true); } else { return(false); } }
public static byte[] GenerarFirmaElectronica(byte[] message, BigInteger privateKey) { while (true) { //Genero un valor 'k' aleatorio BigInteger k = Helper.Random(Params.n); //Calculo el punto P = k*G Punto kP = k * Params.G; BigInteger r = Arithmetic.Mod(kP.x, Params.n); if (r.IsZero) { continue; } var eHash = FirmaElectronica.ObtenerHash(message); var e = new BigInteger(eHash); if (e.Sign == -1) { e = BigInteger.Negate(e); } BigInteger s = Arithmetic.Mod( Arithmetic.Inversion_ExtendedEuclidean(k, Params.n) * (e + privateKey * r), Params.n ); var asn1 = new ASN1_Generator.ASN1_Generator(); var seq = new ASN1_Generator.ASN1_Sequence(); seq.content.Add(new ASN1_Generator.ASN1_Integer() { Value = r }); seq.content.Add(new ASN1_Generator.ASN1_Integer() { Value = s }); asn1.Elements.Add(seq); return(asn1.GetBytes()); } }