SM2隐式证书用户公私钥生成python代码实现

GMT0130-2023具体描述基于SM2算法的隐式证书公钥机制,这里尝试Python代码实现密钥生成部分功能,具体如下,椭圆曲线计算实现使用python第三方包gmssl。

#生成用户私钥Da和公钥Pa,其中Da=(tA+d'A)mod N,Pa可以直接用Da计算出来,当然也可以使用标准中的公式Pa=WA+[lambda]Ppub得到。

def on_click_gen_da_pa():
    global asymmetric_sm2_imp_user_da_text, default_sm2_table
    try:
        ta_h = gen_ta()
        d_a = bytes.fromhex(asymmetric_sm2_imp_user_da_text.get(1.0, END).strip().replace("\n", ""))
        d_a_h = d_a.hex()
        da = (int(ta_h, base=16) + int(d_a_h, base=16)) % int(default_sm2_table['n'], base=16)
        da_h = f'{da:32x}'
        write_log_to_Text("INFO:Da " + da_h, 2)
        pa_h = gen_p(da_h)
        write_log_to_Text("INFO:Pa " + pa_h, 2)
    except Exception as e:
        write_log_to_Text("ERROR:generate User keys failed:" + str(e), 2)

#计算tA=(w+lambda*ms)mod N

def gen_ta():
    global asymmetric_sm2_imp_kgc_w_text, asymmetric_sm2_imp_kgc_ms_text,default_sm2_table
    w = bytes.fromhex(asymmetric_sm2_imp_kgc_w_text.get(1.0, END).strip().replace("\n", ""))
    w_h = w.hex()
    lambda_ = gen_lamda()
    ms = bytes.fromhex(asymmetric_sm2_imp_kgc_ms_text.get(1.0, END).strip().replace("\n", ""))
    ms_h = ms.hex()
    ta = (int(w_h, base=16) + int(lambda_, base=16)*int(ms_h, base=16)) % int(default_sm2_table['n'], base=16)
    ta_h = f'{ta:32x}'
    write_log_to_Text("INFO:Ta " + ta_h, 2)
    return ta_h

#计算lambda=Hash_SM3(x_WA||y_WA||Ha) mod N

def gen_lamda():
    global default_sm2_table
    HA = gen_ha()
    (WA_x, Wa_y) = gen_wa()
    lambda_before_hash = WA_x + Wa_y + HA
    lambda_before_hash_bytes = bytes.fromhex(lambda_before_hash)
    lambda_i_d = [ch for ch in lambda_before_hash_bytes]
    lambda___ = gmssl.sm3.sm3_hash(lambda_i_d)
    lambda__ = int(lambda___, base=16) % int(default_sm2_table['n'], base=16)
    lambda_h = f'{lambda__:64x}'
    write_log_to_Text("INFO:lambda " + lambda_h, 2)
    return lambda_h

#计算WA=[w]G+Ua

def gen_wa():
    global asymmetric_sm2_imp_user_ua_x_var, asymmetric_sm2_imp_user_ua_y_var, asymmetric_sm2_imp_kgc_w_text
    w = bytes.fromhex(asymmetric_sm2_imp_kgc_w_text.get(1.0, END).strip().replace("\n", ""))
    w_h = w.hex()
    wa_p_h = gen_p(w_h, 2)
    ua_h = asymmetric_sm2_imp_user_ua_x_var.get() + asymmetric_sm2_imp_user_ua_y_var.get()
    tSm2 = sm2.CryptSM2('','')
    WA = tSm2._convert_jacb_to_nor(tSm2._add_point(wa_p_h, ua_h))
    WA_x = WA[0:64]
    WA_y = WA[64:]
    write_log_to_Text("INFO:WA_x " + WA_x, 2)
    write_log_to_Text("INFO:WA_y " + WA_y, 2)
    return WA_x, WA_y

#计算Ha=Hash_SM3(ENTLa||IDa||a||b||x_G||y_G||x_pub||y_pub)

def gen_ha():
    global asymmetric_sm2_imp_user_id_var, default_sm2_table, asymmetric_sm2_imp_kgc_pub_x_var, asymmetric_sm2_imp_kgc_pub_y_var
    ida = asymmetric_sm2_imp_user_id_var.get().encode('GBK')
    ida_h = ida.hex()
    pubx = asymmetric_sm2_imp_kgc_pub_x_var.get()
    puby = asymmetric_sm2_imp_kgc_pub_y_var.get()
    entla = len(ida)*8
    entla_h = f'{entla:04x}'
    HA_before_hash = entla_h + str(ida_h) + default_sm2_table['a'] + default_sm2_table['b'] + default_sm2_table['g'] + pubx + puby
    HA_before_hash_bytes = bytes.fromhex(HA_before_hash)
    ha_i_d = [ch for ch in HA_before_hash_bytes]
    ha_h = gmssl.sm3.sm3_hash(ha_i_d)
    write_log_to_Text("INFO:HA " + ha_h, 2)
    return ha_h

实现结果:

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鲦亭长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值