/// <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"); } }
/// <summary> /// 数字签名算法 /// 利用自己的公私钥生成rs并存入文件 /// </summary> /// <param name="sm2">sm2对象</param> /// <param name="pripk">自己的私钥文件夹</param> /// <param name="ppk">自己的公钥文件路径</param> /// <param name="ida">用户名</param> public string Test_sm2_sign(SM2 sm2, string pripk, string ppk, string ida) { BigInteger test_d = null; ECPoint test_p = null; byte[] key = null; //读取私钥 Readprikey(out test_d, pripk); //读取公钥 ReadpublicKey(out key, 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 = sm2.Sm2GetZ(Encoding.Default.GetBytes(ida), test_p);//调用Sm2GetZ方法求a的Z的字节数组 sm3.BlockUpdate(z, 0, z.Length); byte[] md = new byte[32]; sm3.DoFinal(md, 0); sm2.Sm2Sign(md, test_d, test_p, sm2Ret); //生成rs Writers(sm2Ret.r, sm2Ret.s, ida + "rs" + ".txt"); //写入rs文件 return(byteToHexStr(z)); }