我有私钥生成:openssl genpkey -algorithm ed25519 -out private.pem

-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEINTZWUEn/Jt6TV9OxGxjD+6CtqKB3MtcJdFAzFUg3fk/
-----END PRIVATE KEY-----

我还有一个公钥:openssl pkey -in private.pem -out public.pem

-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAPBDjfKgiUSIjVLrvsR+pxw5i9unTpr8S5BL04T13r6w=
-----END PUBLIC KEY-----

现在我不知道,我怎样才能从这些C#中的PEM获得公钥和私钥?在我之前的问题Generating public ed25519 key with OpenSSL中,我发现公钥是X509/SPKI格式,私钥是PKCS#8格式.但是如何在C#中从这些格式中获得正确的键呢?我try 了X509Certificate2类,但什么也没有得到.

推荐答案

Ed25519可以在上实现.NET,例如BouncyCastle,并在这两个平台上运行.NET框架和.净核心.

BouncyCastle还提供了一种使用PemReader类导入directly个PEM密钥的方法.

例子:

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.OpenSsl;
using System;
using System.IO;
using System.Text;

...

//
// Signing
//

// Import private key
string ed25519pkcs8 = @"-----BEGIN PRIVATE KEY-----
                        MC4CAQAwBQYDK2VwBCIEIAYIsKL0xkTkAXDhUN6eDheqODEOGyFZ04jsgFNCFxZf
                        -----END PRIVATE KEY-----";
PemReader pemReaderPrivate = new PemReader(new StringReader(ed25519pkcs8));
Ed25519PrivateKeyParameters ed25519pkcs8Parameters = (Ed25519PrivateKeyParameters)pemReaderPrivate.ReadObject();

// Sign
byte[] dataToSign = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");
ISigner signer = new Ed25519Signer();
signer.Init(true, ed25519pkcs8Parameters);
signer.BlockUpdate(dataToSign, 0, dataToSign.Length);
byte[] signature = signer.GenerateSignature();
Console.WriteLine("Signature: " + Convert.ToBase64String(signature)); // Signature: MTAK9rOibXN1RBOP3O6cRf7Dut1wS6pdz9xM11NIMjg/G0vEusn0piL1iTUcVZvfPNr4PHZSsjp6qX9HkCKRCw==

//
// Verifying
//

// Import public key
string ed25519x509 = @"-----BEGIN PUBLIC KEY-----
                      MCowBQYDK2VwAyEA3mcwgf2DrWLR3mQ6l2d59bGU6qUStwQrln2+rKlKxoA=
                      -----END PUBLIC KEY-----";
PemReader pemReaderPublic = new PemReader(new StringReader(ed25519x509));
Ed25519PublicKeyParameters ed25519x509Parameters = (Ed25519PublicKeyParameters)pemReaderPublic.ReadObject();

// Verify
ISigner verifier = new Ed25519Signer();
verifier.Init(false, ed25519x509Parameters);
verifier.BlockUpdate(dataToSign, 0, dataToSign.Length);
bool verified = verifier.VerifySignature(signature);
Console.WriteLine("Verification: " + verified); // Verification: True

对于输出:

Signature: MTAK9rOibXN1RBOP3O6cRf7Dut1wS6pdz9xM11NIMjg/G0vEusn0piL1iTUcVZvfPNr4PHZSsjp6qX9HkCKRCw==
Verification: True

Csharp相关问答推荐

C#中的两个线程之间读写浮点类型

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

一小时后,自定义缓存停止在App Insight中保存

读取配置文件(mytest. exe. config)

使用LINQ to XML获取元素值列表是不起作用的

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

将XPS转换为PDF C#

Blazor Foreach仅渲染最后一种 colored颜色

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

SortedSet.Remove()不会删除SortedSet.Min返回的元素

MS Graph v5.42.0:在寻呼消息时更改页面大小

C#无法让WinForm进度条生成动画错误跨线程操作无效

使用泛型可空类实现接口

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

Postgres ENUM类型在第一次运行时对Dapper不可见

多个选项卡上的MudForm验证

WPF:如何从DatagridHeader的内容模板绑定到词典项

仅在Blazor Web App中覆盖生产的基本路径(.NET8中的_Hosts.cshtml文件功能?)

使用LibraryImport在多个dll中导入相同的函数

我想我必须手动使用res1(字符串形式的PowerShell哈希表)