示例#1
0
            private void NextKey()
            {
                SM3Digest sm3keycur = new SM3Digest(sm3keybase);

                sm3keycur.Update((byte)(ct >> 24 & 0x00ff)); //调用密码杂凑Update方法
                sm3keycur.Update((byte)(ct >> 16 & 0x00ff)); //调用密码杂凑Update方法
                sm3keycur.Update((byte)(ct >> 8 & 0x00ff));  //调用密码杂凑Update方法
                sm3keycur.Update((byte)(ct & 0x00ff));
                sm3keycur.DoFinal(key, 0);                   //调用密码杂凑DoFinal方法
                keyOff = 0;
                ct++;
            }
示例#2
0
        /*M2签名同样也是需要先摘要原文数据,即先使用SM3密码杂凑算法计算出32byte摘要。SM3需要摘要签名方ID(默认1234567812345678)、
         * 曲线参数a,b,Gx,Gy、共钥坐标(x,y)计算出Z值,然后再杂凑原文得出摘要数据。这个地方要注意曲线参数和坐标点都是32byte,
         * 在转换为BigInteger大数计算转成字节流时要去掉空补位,否则可能会出现摘要计算不正确的问题:*/
        /// <summary>
        /// 计算Z值
        /// </summary>
        /// <param name="userId">签名方ID</param>
        /// <param name="userKey">曲线的各个参数</param>
        /// <returns></returns>
        public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey)
        {
            SM3Digest sm3 = new SM3Digest();

            byte[] p;
            // userId length
            int len = userId.Length * 8;//求userId的长度

            sm3.Update((byte)(len >> 8 & 0x00ff));
            sm3.Update((byte)(len & 0x00ff));

            // userId
            sm3.BlockUpdate(userId, 0, userId.Length);

            // a,b
            p = ecc_a.ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);
            p = ecc_b.ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);
            // gx,gy
            p = ecc_gx.ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);
            p = ecc_gy.ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);

            // x,y
            p = userKey.X.ToBigInteger().ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);
            p = userKey.Y.ToBigInteger().ToByteArray();
            sm3.BlockUpdate(p, 0, p.Length);

            // Z
            byte[] md = new byte[sm3.GetDigestSize()];
            sm3.DoFinal(md, 0);

            return(md);
        }