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
实现结果: