コード例 #1
0
        /// <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");
            }
        }
コード例 #2
0
        /// <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));
        }