SM2 原文签名与HASH签名实现区别

原文签名

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签名工具校验通过。





你可能感兴趣的:(android)