原文签名
1、Z值计算:
public static final String ecc_a = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"; public static final String ecc_b = "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"; public static final String ecc_gx = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7"; public static final String ecc_gy = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"; private static final String SM2_ID = "31323334353637383132333435363738"; public byte[] sm2GetZSM(String smX, String smY) { RefUtil.d("x : " + smX + " , y:" + smY); SM3Digest sm3 = new SM3Digest(); byte[] userId = Util.hexStringToBytes(SM2_ID); int len = userId.length * 8; sm3.update((byte) (len >> 8 & 255)); sm3.update((byte) (len & 255)); sm3.update(userId, 0, userId.length); byte[] p = Util.hexStringToBytes(this.ecc_a); sm3.update(p, 0, p.length); p = Util.hexStringToBytes(this.ecc_b); sm3.update(p, 0, p.length); p = Util.hexStringToBytes(this.ecc_gx); sm3.update(p, 0, p.length); p = Util.hexStringToBytes(this.ecc_gy); sm3.update(p, 0, p.length); p = Util.hexStringToBytes(smX); sm3.update(p, 0, p.length); p = Util.hexStringToBytes(smY); sm3.update(p, 0, p.length); byte[] md = new byte[sm3.getDigestSize()]; sm3.doFinal(md, 0); return md; }
2、使用Z值和待签名数据通过SM3算的杂凑值,该杂凑值用于SM2签名
public byte[] sm2GetSignData(byte[] z, byte[] sourceData) { SM3Digest sm3 = new SM3Digest(); sm3.update(z, 0, z.length); sm3.update(sourceData, 0, sourceData.length); byte[] md = new byte[sm3.getDigestSize()]; sm3.doFinal(md, 0); return md; }
3、做签名,验签时同理,执行1、2 获取验签原文,之后验证签名。
HASH签名:
不执行上述1、2,直接做签名,之后验证签名,可以使用工具 Sign_E、 Verify_E。
上述两种方式,均可使用sm2签名工具校验通过。