gpt4 book ai didi

c# - 如何从 ECDsa 或 ECDsaCng 对象中提取文本私钥和公钥?

转载 作者:行者123 更新时间:2023-12-02 01:40:00 27 4
gpt4 key购买 nike

当创建 ECDSA 对象并尝试提取私钥和公钥对象时,它会返回一个 byte[]。但是当尝试将其转换为字符串时,它给出的输出看起来不正确。

// Creating the object with default parameters
ECDsa ecdSa = ECDsa.Create(ECCurve.NamedCurves.nistP256);

// Export parameters
ECParameters ecParamters = ecdSa.ExportParameters(true);

// Private Key
byte[] privateKey = ecParamters.D;

// Public key params
ECPoint publicKey = ecParamters.Q;

// Coordinates
byte[] publicKeyX = publicKey.X; // What format? int, double, etc
byte[] publicKeyY = publicKey.Y; // What format? int, double, etc

ECParameters 上方提供了对曲线D(私钥)Q(公钥) 的访问权限.

知道这些字节数组中使用的是哪种格式吗?我们如何将其转换为字符串格式,例如:将私钥和公钥转换为 PKCS#8

最佳答案

D 就是raw 私钥,X 和Y 是raw 公钥的两个坐标。对于 P-256,这些都是 32 个字节。

自 .NET Core 3.0 以来,支持以 PKCS#8 格式 (ExportPkcs8PrivateKey()) 和 SEC1 格式 (ExportECPrivateKey()) 导出 ECDSA 私钥直接,并支持以 X. 509 格式 ( ExportSubjectPublicKeyInfo() )。无需通过 ExportParameters() 绕行!导出的 key 是 DER 编码的。

例子:

ECDsa ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256);

byte[] privatePkcs8Der = ecdsa.ExportPkcs8PrivateKey();
byte[] privateSec1Der = ecdsa.ExportECPrivateKey();
byte[] publicX509Der = ecdsa.ExportSubjectPublicKeyInfo();

从 DER 到 PEM 编码的转换很简单:Base64 编码,在每 64 个字符后插入一个换行符并添加格式特定的页眉和页脚。或者,您可以使用 BouncyCaSTLe(例如,通过 Org.BouncyCaSTLe.Utilities.IO.Pem.PemWriter 用于 PKCS#8):

using Org.BouncyCastle.Utilities.IO.Pem;
using System.IO;
...
StringWriter stringWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(stringWriter);
pemWriter.WriteObject((PemObjectGenerator)new PemObject("PRIVATE KEY", privatePkcs8Der)); // SEC1: EC PRIVATE KEY, X.509: PUBLIC KEY
Console.WriteLine(stringWriter.ToString());

从 .NET 5 开始,PEM 编码也直接支持,但仅用于导入:ImportFromPem() .

注意对 ECDH 和 RSA key 存在类似的支持。

关于c# - 如何从 ECDsa 或 ECDsaCng 对象中提取文本私钥和公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71746201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com