- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当创建 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/
我是一名优秀的程序员,十分优秀!