/** * 计算hash值,在数据量不大时使用,数据量大应使用原生接口,分段计算sm3值 * @param srcData 待计算hash值的数据 * @return */ public static byte[] Hash(byte[] srcData) { SM3Digest digest = new SM3Digest(); digest.BlockUpdate(srcData, 0, srcData.Length); byte[] hash = new byte[digest.GetDigestSize()]; digest.DoFinal(hash, 0); return(hash); }
/// <summary> /// 获取杂凑值H /// </summary> /// <param name="z">Z值</param> /// <param name="data">待签名消息</param> /// <returns></returns> public virtual byte[] Sm2GetH(byte[] z, byte[] data) { SM3Digest sm3 = new SM3Digest(); //Z sm3.BlockUpdate(z, 0, z.Length); //待签名消息 sm3.BlockUpdate(data, 0, data.Length); // H byte[] md = new byte[sm3.GetDigestSize()]; sm3.DoFinal(md, 0); return(md); }
public override void PerformTest() { base.PerformTest(); SM3Digest dig = new SM3Digest(); byte[] resBuf = new byte[dig.GetDigestSize()]; VectorTest(dig, 10, resBuf, Hex.Decode(hexMessages[0]), Hex.Decode(digests[messages.Length])); VectorTest(dig, 11, resBuf, Hex.Decode(hexMessages[1]), Hex.Decode(digests[messages.Length + 1])); VectorTest(dig, 12, resBuf, Hex.Decode(hexMessages[2]), Hex.Decode(digests[messages.Length + 2])); VectorTest(dig, 13, resBuf, Hex.Decode(hexMessages[3]), Hex.Decode(digests[messages.Length + 3])); VectorTest(dig, 14, resBuf, Hex.Decode(hexMessages[4]), Hex.Decode(digests[messages.Length + 4])); VectorTest(dig, 15, resBuf, Hex.Decode(hexMessages[5]), Hex.Decode(digests[messages.Length + 5])); VectorTest(dig, 16, resBuf, Hex.Decode(hexMessages[6]), Hex.Decode(digests[messages.Length + 6])); VectorTest(dig, 17, resBuf, Hex.Decode(hexMessages[7]), Hex.Decode(digests[messages.Length + 7])); sixtyFourKTest(sixtyFourKdigest); millionATest(million_a_digest); }
public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey) { SM3Digest sm3 = new SM3Digest(); byte[] p; // userId length int len = userId.Length * 8; 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.AffineXCoord.ToBigInteger().ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); p = userKey.AffineYCoord.ToBigInteger().ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); // Z byte[] md = new byte[sm3.GetDigestSize()]; sm3.DoFinal(md, 0); return(md); }
/// <summary> /// 获取Z值 /// Z=SM3(ENTL∣∣userId∣∣a∣∣b∣∣gx∣∣gy ∣∣x∣∣y) /// </summary> /// <param name="userId">签名方的用户身份标识</param> /// <param name="userKey">签名方公钥</param> /// <returns></returns> public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey) { SM3Digest sm3 = new SM3Digest(); byte[] p; // ENTL由2个字节标识的ID的比特长度 int len = userId.Length * 8; sm3.Update((byte)(len >> 8 & 0x00ff)); sm3.Update((byte)(len & 0x00ff)); // userId用户身份标识ID sm3.BlockUpdate(userId, 0, userId.Length); // a,b为系统曲线参数; p = EccA.ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); p = EccB.ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); // gx、gy为基点 p = EccGx.ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); p = EccGy.ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); // x,y用户的公钥的X和Y p = userKey.Normalize().XCoord.ToBigInteger().ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); p = userKey.Normalize().YCoord.ToBigInteger().ToByteArray(); sm3.BlockUpdate(p, 0, p.Length); // Z byte[] md = new byte[sm3.GetDigestSize()]; sm3.DoFinal(md, 0); return(md); }
public override void Initialize() { HashValue = new byte[_digest.GetDigestSize()]; }