cbanor / X-Website

Multilingual translation and error feedback and fixes
13 stars 0 forks source link

请问一下怎么将我的hex格式的sm2密钥转换为pem格式的吗?可以分享一下算法吗?因为我看好像不是简单的base64编码。感谢 #4

Closed madsinbad closed 1 year ago

cbanor commented 1 year ago

最简单的方法,你可以拿任意sm2密钥,base64解码成byte[] ,然后替换原来的hex密钥。用编码回base64即可。

如果你项目中有用到BoundCastle 库,你可以参考以下代码:         const string CURVE_NAME = "sm2p256v1";

        /// <summary>         /// 通过hex祼密钥,创建私钥实体         /// </summary>         /// <param name="hex"></param>         /// <returns></returns>         public static ECPrivateKeyParameters GetPrivateKey(byte[] hex)         {             var oid = GMNamedCurves.GetOid(CURVE_NAME);             return new ECPrivateKeyParameters("EC", new BigInteger(1, hex), oid);         }

------------------ 原始邮件 ------------------ 发件人: "cbanor/X-Website" @.>; 发送时间: 2022年9月14日(星期三) 下午4:36 @.>; @.***>; 主题: [cbanor/X-Website] 请问一下怎么将我的hex格式的sm2密钥转换为pem格式的吗?可以分享一下算法吗?因为我看好像不是简单的base64编码。感谢 (Issue #4)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

madsinbad commented 1 year ago

您好,我刚才把一个pem格式公钥经过base64解码后,发现倒数后64位就是hex的公钥本体,感谢! 另外还有一个问题,我这边刚下在您的网站上做了一下操作:

  1. 我把我这个一个hex的私钥:26e74535b5f5435090c6763d6500b6cc7578d61bf3871557474ccbbaf22e856d填进您那个网站的SM2加解密的密钥框后,他自动转成了pem格式:

    -----BEGIN EC PRIVATE KEY-----
    MHcCAQEEICbnRTW19UNQkMZ2PWUAtsx1eNYb84cVV0dMy7ryLoVtoAoGCCqBHM9V
    AYItoUQDQgAEm6nV9amsKV6MurKa2/lID19byNpUP8VH+v+HxAMtagxte5fCiGkL
    SFJI22hCCdeNbP/n5KZeRUItZzjozt8ixQ==
    -----END EC PRIVATE KEY-----
  2. 而且我使用asn.1将其解码后,发现里面不仅有私钥本体,而且还逆推出了其对应的公钥

<SEQUENCE>
 <INTEGER>1</INTEGER>
 <OCTET_STRING>0x26E74535B5F5435090C6763D6500B6CC7578D61BF3871557474CCBBAF22E856D</OCTET_STRING>
 <NODE Sign="a0">
  <OBJECT_IDENTIFIER Comment="China GM Standards Committee" Description="sm2ECC">1.2.156.10197.1.301</OBJECT_IDENTIFIER>
 </NODE>
 <NODE Sign="a1">
  <BIT_STRING>0x00049BA9D5F5A9AC295E8CBAB29ADBF9480F5F5BC8DA543FC547FAFF87C4032D6A0C6D7B97C288690B485248DB684209D78D6CFFE7E4A65E45422D6738E8CEDF22C5</BIT_STRING>
 </NODE>
</SEQUENCE>

请问下,如果我在不知道公钥的情况下,怎么通过您说的那个暴力方法生成带有公钥信息的私钥pem呢? QAQ

cbanor commented 1 year ago

公钥是可以通过私钥计算出来的。具体的算法没有去细究。我用的是前面提及的三方库。 网上应该有公开的算法。有兴趣你可以研究一下

Message ID: @.***>

madsinbad commented 1 year ago

我今天试了一下,按照你说的方式已经实现了,非常感谢(: