我有一个ECC私钥和一个证书文件,其中包含公钥。我可以获取它们的PEM或DER格式。
我可以使用以下代码将证书读入X509Certificate
:
var certbytes = File.ReadAllBytes("certificate.pem");
var cert = new X509Certificate2(certbytes);
但是我无法加载私钥。 我已尝试使用以下代码:
var keyContent = File.ReadAllBytes("certificate_private_key.pem");
var key = CngKey.Import(keyContent, CngKeyBlobFormat.EccPrivateBlob);
它会抛出 Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: '在编码或解码操作期间发生错误'
。
我还尝试了CngKeyBlobFormat
参数的其他值。导入方法也失败了。
openssl可以读取该文件,并输出以下关于该文件的信息:
openssl ec -in certificate_private_key.pem -text
read EC key
Private-Key: (256 bit)
priv:
44:<cut>:68
pub:
04:<cut>:13
ASN1 OID: prime256v1
NIST CURVE: P-256
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcC <cut here>
-----END EC PRIVATE KEY-----
在 .NET 或 .NET Core 中是否有内置的 API 可以实现这一功能?或者有第三方库可以实现,如何使用?
openssl pkcs8
无法理解该文件,只有openssl ec
可以。我已经拥有DER和PEM格式的文件,但都无法使用。根据CngKeyBlobFormat
参数,异常要么是编码或解码操作期间发生错误
,要么是参数不正确
。我还尝试将DER文件转换为显式EC文件,使用openssl ec -in certificate_private_key.der -inform DER -param_enc explicit -out explicit.der -outform der
,并将CngKeyBlobFormat.EccFullPrivateBlob
用作格式,但在导入时仍然失败。 - RasmusW-----BEGIN EC PRIVATE KEY-----
头部应该就能看出来了。X9.62私钥是PKCS#8文件中的内容。 - Maarten Bodewesopenssl pkcs8 -topk8 -nocrypt -in oldfile.pem -out newfile.pem
命令,可能也可以使用-outform DER
参数。 - Maarten BodewesPkcs8PrivateBlob
应该真的可行。 - Maarten Bodewesvar privatekey = File.ReadAllBytes("newfile.der"); var privkey = CngKey.Import(privatekey, CngKeyBlobFormat.Pkcs8PrivateBlob); var privkeyecdsa = new ECDsaCng(privkey);
来读取 DER 文件。 - RasmusW