我有一个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: 'An error occurred during encode or decode operation'
。
我还尝试了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可以做到这一点?还是有第三方库可以做到?
答案 0 :(得分:2)
.NET Core 3.0(当前处于预览状态)具有ECDsa.ImportECPrivateKey
,AsymmetricAlgorithm.ImportPkcs8PrivateKey
和AsymmetricAlgorithm.ImportEncryptedPkcs8PrivateKey
(并且RSA具有RSAPublicKey和RSAPrivateKey)以及当前文件({{1} })您想要第一个。
最后一点意味着您当前必须在BEGIN EC PRIVATE KEY
和-----BEGIN EC PRIVATE KEY-----\n
之间找到base64内容并进行debase64-it,然后将其传递给方法。
我知道CNG导入支持的唯一私有密钥格式是PKCS8,加密的PKCS8和CNG私有格式。要使用CngKey.Import,您首先需要将密钥文件转换为PKCS#8,然后按照注释中的建议指定格式为\n-----END EC PRIVATE KEY-----
。