duanhongyi / gmssl

a python crypto for sm2/sm3/sm4
MIT License
482 stars 140 forks source link

怎么把支付宝生成的sm2格式的公私钥 转成 16 进制的公私钥 #85

Closed chengh0 closed 8 months ago

chengh0 commented 8 months ago
image

公钥:MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEw7HaSXoBMMJ1TSjYILT+DwgOV6cl99DkMt+BSTT08aL4k1TYGN8IK9rFqe4+0PK77NKid0KnCPpQ+OXo7E0B2Q==

私钥: MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgUyKbopOiWomZYazmPz69QbnMahzoLgenzSI3qN5eA+WgCgYIKoEcz1UBgi2hRANCAATDsdpJegEwwnVNKNggtP4PCA5XpyX30OQy34FJNPTxoviTVNgY3wgr2sWp7j7Q8rvs0qJ3QqcI+lD45ejsTQHZ

转成这种格式的

16进制的公钥和私钥

private_key = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5' public_key = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'

PrimumMobile commented 7 months ago
from base64 import b64decode
private_key_str = ""
der_bytes = b64decode(private_key_str).hex()
print(der_bytes[72:136].upper())
cankai commented 6 months ago

72:136 这个区间代表什么含义. 公钥也是如此吗?

PrimumMobile commented 6 months ago

72:136 这个区间代表什么含义. 公钥也是如此吗?

der_bytes下标为72的地方开始存放私钥,SM2私钥为256bit,转换为hex格式后长度为64,所以只需要取72:136区间里hex格式的数据就可以了,公钥区间是[-128:],公钥存放在der_bytes的末尾,公钥长为512bit,转换为hex格式后长度为128,所以只需要取 [-128:] 这个区间就可以了。

lhy2749 commented 4 months ago

请问一下使用java生成的base64格式的SM4密钥怎么转换为16进制呢?

PrimumMobile commented 4 months ago

请问一下使用java生成的base64格式的SM4密钥怎么转换为16进制呢?

可以试下python的asn1tools这个库,之前用它搞过sm2的密钥,sm4的你可以试下