Пример #1
0
        public static bool Verify(byte[] msg, byte[] signData, byte[] certData)
        {
            var x5092 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certData);

            byte[] certPK = x5092.GetPublicKey();

            certPK = ByteUtils.SubBytes(certPK, 1, 64);

            byte[] certPKX = ByteUtils.SubBytes(certPK, certPK.Length - 32 - 32, 32);
            byte[] certPKY = ByteUtils.SubBytes(certPK, certPK.Length - 32, 32);


            System.String strcertPKX = ByteUtils.ByteArrayToHex(certPKX);
            System.String strcertPKY = ByteUtils.ByteArrayToHex(certPKY);
            BigInteger    biX        = new BigInteger(strcertPKX, 16);
            BigInteger    biY        = new BigInteger(strcertPKY, 16);


            ECFieldElement x = new FpFieldElement(SM2CryptoServiceProvider.Instance.ecc_p, biX);
            ECFieldElement y = new FpFieldElement(SM2CryptoServiceProvider.Instance.ecc_p, biY);

            ECPoint userKey = new FpPoint(SM2CryptoServiceProvider.Instance.ecc_curve, x, y);


            SM3Digest sm3 = new SM3Digest();

            byte[] z = SM2CryptoServiceProvider.Instance.Sm2GetZ(Encoding.Default.GetBytes(SM2CryptoServiceProvider.Instance.userId), userKey);
            sm3.BlockUpdate(z, 0, z.Length);


            byte[] p = msg;
            sm3.BlockUpdate(p, 0, p.Length);

            byte[] md = new byte[32];
            sm3.DoFinal(md, 0);


            byte[] btR = ByteUtils.SubBytes(signData, 0, 32);
            byte[] btS = ByteUtils.SubBytes(signData, 32, 32);


            System.String strR = ByteUtils.ByteArrayToHex(btR);
            System.String strS = ByteUtils.ByteArrayToHex(btS);
            BigInteger    r    = new BigInteger(strR, 16);
            BigInteger    s    = new BigInteger(strS, 16);

            // e_
            BigInteger e = new BigInteger(1, md);
            // t
            BigInteger t = r.Add(s).Mod(SM2CryptoServiceProvider.Instance.ecc_n);

            if (t.Equals(BigInteger.Zero))
            {
                return(false);
            }

            // x1y1
            ECPoint x1y1 = SM2CryptoServiceProvider.Instance.ecc_point_g.Multiply(s);

            x1y1 = x1y1.Add(userKey.Multiply(t));

            // R
            BigInteger R = e.Add(x1y1.X.ToBigInteger()).Mod(SM2CryptoServiceProvider.Instance.ecc_n);

            return(r.Equals(R));
        }