在创建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允许访问curve、D (private key)和Q (public key)。
知道在这些字节数组中使用了什么样的格式吗?如何将其转换为字符串格式,例如:PKCS#8的私钥和公钥
发布于 2022-04-05 07:43:30
D只是raw私钥,X和Y是raw公钥的两个坐标。对于P-256来说,每个字节是32个字节。
自.NET Core3.0以来,支持直接导出PKCS#8格式(ExportPkcs8PrivateKey())和SEC1格式(ExportECPrivateKey())的专用ECDSA密钥和X.509格式(ExportSubjectPublicKeyInfo())的公共ECDSA密钥。通过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编码,但只支持导入:ImportFromPem()。
注意,ECDH和RSA密钥也有类似的支持。
https://stackoverflow.com/questions/71746201
复制相似问题