/// <summary> /// 签名验证算法 /// 利用签名者的公钥和传过来的r,s来验证签名是否合法 /// </summary> /// <param name="sm2">sm2对象</param> /// <param name="ppk">签名者的公钥16进制字符串</param> /// <param name="Z">签名算法产生的16进制字符串 Z</param> /// <param name="r">签名算法生成的 R</param> /// <param name="s">签名算法生成的 S</param> /// <returns></returns> public bool Signature_Check(SM2 sm2, string ppk, string Z, string r, string s) { ECPoint test_p = null; //test_p = sm2.userKey; //MessageBox.Show(ppk); byte[] key = strToToHexByte(ppk); test_p = sm2.ecc_curve.DecodePoint(key); Com.Itrus.Crypto.SM2.SM2Result sm2Ret = new Com.Itrus.Crypto.SM2.SM2Result();//实例化一个SM2Result的对象sm2Ret SM3Digest sm3 = new SM3Digest(); byte[] z = strToToHexByte(Z); sm3.BlockUpdate(z, 0, z.Length); byte[] md = new byte[32]; sm3.DoFinal(md, 0); sm2Ret.r = new BigInteger(r, 16); sm2Ret.s = new BigInteger(s, 16); sm2.Sm2Verify(md, test_p, sm2Ret.r, sm2Ret.s, sm2Ret); //调用Sm2Verify方法,得到R if (sm2Ret.r.Equals(sm2Ret.R)) //如果r==R { return(true); //System.Console.Out.WriteLine("\n签名结果验证通过!r == R\n"); } else//r!=R { return(false);//System.Console.Out.WriteLine("\n签名结果验证失败!r != R\n"); } }
public static bool VerifySign(string _dataToSign, string _signPack, string _pubKeyX, string _pubKeyY) { SM2 sm2 = SM2.Instance; sm2.cipher_sm = new SM2.Cipher(); string signPack1 = _signPack.Substring(0, 64); string signPack2 = _signPack.Substring(64, 64); BigInteger ecc_gx = new BigInteger(_pubKeyX, 16); BigInteger ecc_gy = new BigInteger(_pubKeyY, 16); ECFieldElement ecc_gx_fieldElement = sm2.ecc_curve.FromBigInteger(ecc_gx); //选定椭圆曲线上基点 G 的 x 坐标 ECFieldElement ecc_gy_fieldElement = sm2.ecc_curve.FromBigInteger(ecc_gy); //选定椭圆曲线上基点 G 的 y 坐标 ECPoint ecc_point_g = new FpPoint(sm2.ecc_curve, ecc_gx_fieldElement, ecc_gy_fieldElement); //生成基点 G SM2.SM2Result result = new SM2.SM2Result(); BigInteger gp_br = new BigInteger(signPack1, 16); BigInteger gp_bs = new BigInteger(signPack2, 16); result.r = gp_br; result.s = gp_bs; sm2.Sm2Verify(HexStringToBytes(_dataToSign), ecc_point_g, gp_br, gp_bs, result); return(result.R.Equals(result.r)); }