SM2 HEX 公钥转 Base64
小于 1 分钟
SM2 HEX 公钥转 Base64
之前没有详细了解过sm2的组成、这个问题折腾了一上午。终于找到了解决办法。
原理
其实 Base64 的公钥只是多了一步 ASN.1 的编码。用 ASN.1 解码工具解码 Base64 的公钥可以得到以下结果:
Base64 公钥
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE16LwYmnY3GmvpSw4RF05MXy+pCO8zEGTF5M9zFgnWAEWP5qxv86ubFjo4lzCzAm5BWFrF6VWhMnTf5k5AUK2+Q==
ASN.1 解码
<SEQUENCE>
<SEQUENCE>
<OBJECT_IDENTIFIER Comment="ANSI X9.62 public key type" Description="ecPublicKey">1.2.840.10045.2.1</OBJECT_IDENTIFIER>
<OBJECT_IDENTIFIER Comment="China GM Standards Committee" Description="sm2ECC">1.2.156.10197.1.301</OBJECT_IDENTIFIER>
</SEQUENCE>
<BIT_STRING>0x0004D7A2F06269D8DC69AFA52C38445D39317CBEA423BCCC419317933DCC58275801163F9AB1BFCEAE6C58E8E25CC2CC09B905616B17A55684C9D37F99390142B6F9</BIT_STRING>
</SEQUENCE>
仔细看能发现 BIT_STRING
部分的内容其实就是 HEX 的公钥本身。所以只需要提出 前面固定的部分转换成 HEX 然后直接和公钥 HEX 拼接在一起转换成 Base64 就能直接使用了。
ASN.1 编码结果的前面部分
HEX
3059301306072a8648ce3d020106082a811ccf5501822d034200
Bytes
[48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 129, 28, 207, 85, 1, 130, 45, 3, 66, 0]
如何使用
直接与 hex 公钥本体部分拼在一起进行 base64 编码就行。
示例:
公钥 HEX:
04d7a2f06269d8dc69afa52c38445d39317cbea423bccc419317933dcc58275801163f9ab1bfceae6c58e8e25cc2cc09b905616b17a55684c9d37f99390142b6f9
结果:
3059301306072a8648ce3d020106082a811ccf5501822d03420004d7a2f06269d8dc69afa52c38445d39317cbea423bccc419317933dcc58275801163f9ab1bfceae6c58e8e25cc2cc09b905616b17a55684c9d37f99390142b6f9
Base64编码后:
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE16LwYmnY3GmvpSw4RF05MXy+pCO8zEGTF5M9zFgnWAEWP5qxv86ubFjo4lzCzAm5BWFrF6VWhMnTf5k5AUK2+Q==
参考文档
https://github.com/cbanor/X-Website/issues/4