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

本文介绍了SM2签名算法中原文签名和HASH签名的实现步骤。原文签名涉及Z值计算及SM3杂凑值的使用,而HASH签名则直接进行签名验证。两种方法在SM2签名工具下均能通过校验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文签名

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





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值