当前位置: 首页 > 知识库问答 >
问题:

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

仲孙经赋
2023-03-14

当创建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

上面的< code>ECParameters提供对< code >曲线 、< code>D(私钥)和< code>Q(公钥)的访问。

知道这些字节数组中使用了什么样的格式吗?我们如何把它转换成一个字符串格式,例如:PKCS#8的私有和公共密钥?

共有1个答案

申屠昆
2023-03-14

D是原始私钥,X和Y是原始公钥的两个坐标。对于P-256,每个字节为32个字节。

自.NET Core 3.0以来,支持直接导出PKCS#8格式(ExportPkcs8PrivateKey())和SEC1格式(ExportECPrivateKey())的私有ECDSA密钥,并支持直接导出X.509格式(ExportSubjectPublicKeyInfo())。不需要通过<code>ExportParameters()

示例:

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

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

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

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编码,但仅适用于导入:())

注意,ECDH和RSA密钥也有类似的支持。

 类似资料:
  • 以下网站经常被引用,而且我认为是准确的: https://gobittest.appspot.com/Address 我试图在Golang中重现这些步骤,但第一步就失败了:-( 有人能给我提供一个Golang片段,给定ECDSA私钥,返回公钥吗?我想我可能具体指的是上述站点示例中的私钥指数和公钥指数。 i、 例如,给定随机生成的(十六进制编码的)私钥(指数?)<代码>E83385AF76B2B19

  • 我已经阅读了如何在OpenSSL中从ECDSA私钥获取公钥? 并想做同样的事情,但在Java中与充气城堡。 我也见过Bouncy Castle ESCDA从私钥创建公钥,但这并没有帮助。

  • 问题内容: 我试图从私钥生成公共ECDSA密钥,但是在Internet上如何进行此操作方面,我还没有找到太多帮助。几乎所有内容都是根据公共密钥规范生成公共密钥的,我不知道该如何获得。到目前为止,这是我汇总的内容: 但是,在运行时,出现以下错误: 我究竟做错了什么?有没有更好/更简便的方法可以做到这一点? 编辑:我设法获得一些代码进行编译,但不能正常工作: 当我运行它时,它会生成一个publicKe

  • 我试图从私钥中生成一个公共ECDSA密钥,但我还没有在互联网上找到多少关于如何实现这一点的帮助。几乎所有的事情都是为了从公钥规范生成公钥,我不知道如何得到它。到目前为止,我总结了以下内容: 但是,在运行时,我会出现以下错误: 我做错了什么?有更好/更简单的方法吗? 编辑:我已经设法编译了一些代码,但它不能正常工作: 当我运行它时,它会生成一个公钥,但它不是私钥对应的公钥。

  • 从这里我指出了自己如何获得公钥,并使用EC_POINT_bn2point,而不是hex2point,根据OpenSSL源代码,它在内部执行BN_hex2bn。 那么,为什么EC_POINT_bn2point返回null呢?我正在认真考虑重新编译OpenSSL,并放一些调试例程来找出它失败的原因。

  • 我正在尝试用c#签署比特币交易。我有两段代码要完成。我可以使用Bouncy castle创建一组私钥和公钥。我可以将其转换为钱包导入格式ok。 我还可以从ECDSA公钥生成比特币地址。 然而,我想签署一项交易,我所拥有的只是我的私钥。我不想把东西放进钱包里签名。那么,在只提供私钥的情况下,如何生成公钥呢? 我发现了一个javascript方法可以做到这一点: 我在充气城堡看到的唯一方法是生成随机一