Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中加载ECC私钥_C#_Cryptography_X509certificate2 - Fatal编程技术网

C# 在.NET中加载ECC私钥

C# 在.NET中加载ECC私钥,c#,cryptography,x509certificate2,C#,Cryptography,X509certificate2,我有一个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 = Cng

我有一个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);
但是我无法加载私钥。我尝试过以下代码:

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.WindowsCryptographyException:“编码或解码操作期间出错”

我还尝试了
CngKeyBlobFormat
参数的其他值。导入方法也会失败

openssl可以读取该文件,并输出有关该文件的以下信息:

openssl ec-in certificate\u private\u key.pem-text
读取EC键
私钥:(256位)
私人:
44::68
酒吧:
04::13
ASN1 OID:prime256v1
NIST曲线:P-256
编写EC密钥
-----开始EC私钥-----
MHcC
-----结束EC私钥-----
在.NET或.NET内核中是否有内置API可以做到这一点?或者是否有第三方库可以做到这一点,以及如何做到这一点?

.NET Core 3.0(目前正在预览)有
ECDsa.ImportECPrivateKey
不对称算法m.importPKCs8 privateKey
、和
不对称算法importEncryptedPKCS8 privateKey
(RSA有RSAPublicKey和rsapprivateKey)以及当前文件(
BEGIN EC PRIVATE KEY
)您可能需要第一个密钥

  • 这些方法的好消息是:它们是存在的
  • 坏消息是:它们是下一个版本的一部分,而不是当前版本
  • 好:下一个版本应该很快就是当前版本
  • 坏:他们只了解BER/DER数据,不了解PEM
最后一点意味着您当前必须在
---BEGIN EC PRIVATE KEY-----\n
\n---END EC PRIVATE KEY-----
和de-base64-it之间找到base64内容,然后将其传递到方法中



据我所知,CNG导入支持的唯一私钥格式是PKCS8、加密PKCS8和CNG私钥格式。要使用CngKey.import,您首先需要将密钥文件转换为PKCS#8,然后指定格式为
Pkcs8PrivateBlob
,如注释中所示。

感谢您的提示。
openssl PKCS8
c我不理解该文件,只有
openssl ec
。我已经有了DER和PEM格式的文件,两者都不起作用。根据
CngKeyBlobFormat
参数,异常情况可能是
在编码或解码操作期间发生错误
或者
参数不正确
。我还尝试转换DER使用
openssl EC-in certificate\u private\u key.der-notify der-param\u enc explicit-out explicit.der-outform der
,并使用
CngKeyBlobFormat.EccFullPrivateBlob
作为格式,将其转换为显式EC文件,但在导入时仍然失败。啊,在这种情况下它是X9.62格式。应该从
开始看到这一点EC私钥------
确实是头文件。X9.62私钥是PKCS#8文件中的内容。请尝试
openssl pkcs8-topk8-nocrypt-in-oldfile.pem-out-newfile.pem
-可能也适用于
-outform DER
。我想这方面有什么进展吗?首先转换为二进制PKCS#8格式,然后使用
Pkcs8PrivateBlob
真的很有效。是的,这很有效。(很抱歉回复太晚-其他工作和睡眠妨碍了你)。现在可以使用
var privatekey=file.ReadAllBytes(“newfile.DER”);var privkey=CngKey.Import(privatekey,CngKeyBlobFormat.Pkcs8PrivateBlob);var privkeyecdsa=new ECDsaCng(privkey)读取DER文件
在.NET中是否有PEM解码实用程序,或者您是否必须使用Bouncy?@MaartenBodewes目前没有。手动或类似BouncyCastle的PEMParser是目前的发展方向。也许下一个版本我可以获得一个符合RFC 7468的(例如,忽略RFC 1421中的标题部分)。谢谢,@bartonjs,这很有效。使用问题中描述的原始文件的DER编码版本,我可以执行
var ecdsa=ecdsa.Create();ecdsa.ImportECPrivateKey(privatekey,out);ecdsa.VerifyHash(dataToVerify,signature)
我非常肯定.NET Core 3.0将在需要投入生产之前面世,所以我想我会沿着这条路走下去。