runliuv

runliuv@cnblogs

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

EC版国密SM2私钥解析C#.NET

EC版国密SM2私钥解析C#.NET , ECC

 

先看下私钥和公钥内容。

开发者私钥:

-----BEGIN EC PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgHqOp471SMDsQml2G
2ErpZPLD2X7rbMqa6P1O9Zqlhe+gCgYIKoEcz1UBgi2hRANCAAQkmEWaN4xGn0bB
KHG1a6e/pafL/+YODalye7SWUNC8hijk7dH5qXf016RyJnQEitPbVj9AmteAkijI
GvpJOaXq
-----END EC PRIVATE KEY-----

平台公钥:

-----BEGIN PUBLIC KEY-----
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEA/////v//////////
//////////8AAAAA//////////8wRAQg/////v////////////////////8AAAAA
//////////wEICjp+p6dn140TVqeS89lCafzl4n1FauPkt28vUFNlA6TBEEEMsSu
LB8ZgRlfmQRGajnJlI/jC7/yZgvhcVpFiTNMdMe8Nzai9PZ3nFm9zuNraSFT0KmH
fMYqR0AC3zLlITnwoAIhAP////7///////////////9yA99rIcYFK1O79Ak51UEj
AgEBA0IABKZ3VWwH0Aw9xvOWXb+xM2gXyApWEAZLFy8UyIigp3ehOTwPJ693njrg
NavTLdzAtFBqXRreivlwBTIFy8iRgn8=
-----END PUBLIC KEY-----

 

文本是PEM格式的,私钥头包含“BEGIN EC PRIVATE”

 

image

 

首先在nuget里下载  BouncyCastle 1.8.9 版本。

image

 

如果是.NET CORE 可以用 Portable.BouncyCastle 或 BouncyCastle.Cryptography,平替。

image

 

控制台解析代码:

 

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleECsm2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string mchPrivateKeyBase64 = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "开发者私钥.txt"));
                mchPrivateKeyBase64 = mchPrivateKeyBase64.Replace("-----BEGIN EC PRIVATE KEY-----", "").Replace("-----END EC PRIVATE KEY-----", "");
                string platPubKeyBase64 = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "平台公钥.txt"));
                platPubKeyBase64 = platPubKeyBase64.Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "");

                AsymmetricKeyParameter mchPrivateKey = PrivateKeyFactory.CreateKey(Convert.FromBase64String(mchPrivateKeyBase64));
                if (mchPrivateKey != null)
                {
                    Console.WriteLine("私钥正常:");
                }
                AsymmetricKeyParameter platPubKeyObj = PublicKeyFactory.CreateKey(Convert.FromBase64String(platPubKeyBase64));
                if (platPubKeyObj != null)
                {
                    Console.WriteLine("公钥正常:");
                }                
            }
            catch (Exception ex)
            {
                Console.WriteLine("ex:" + ex.Message);
            }
            Console.ReadKey();
        }
    }
}

 

 

运行效果:

image

 

 

最终,我们拿到“AsymmetricKeyParameter mchPrivateKey”、“AsymmetricKeyParameter platPubKeyObj” 这2个对象之后,就可以签名或加密了。

image

 

注意:

PEM文本里包含"-----BEGIN EC PRIVATE KEY-----"等字样,要replace掉。

image

 

 

-

posted on 2026-04-15 15:37  runliuv  阅读(11)  评论(0)    收藏  举报