如果不使用第三方BouncyCastle库,有没有办法读取自定义私钥并签名邮件? (sha256 hash +使用私钥加密)
答案 0 :(得分:3)
技术上,是的。根据你所拥有的密钥类型,答案会变得更加棘手。
如果您有这种类型的文件,并且您使用的是.NET 4.6或更高版本,那么是。您需要使用DER编码(vs PEM编码)数据blob(如果它是PEM,请参见下文)。
using (CngKey key = CngKey.Import(blob, CngKeyBlobFormat.Pkcs8PrivateBlob))
using (RSA rsa = new RSACng(key))
{
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
RSA需要4.6,ECDSA需要4.6.1,DSA需要4.6.2。
恭喜,您的私钥传输非常强大。遗憾的是,如果您想要实际处理它,则需要写入最大量的代码。你不想处理它。你真的,真的,想要
请参阅How is a private key encrypted in a pem certificate?,然后继续阅读下一节中的入门知识。不过,你有更多的工作要做。您需要读取文件,了解加密方案和参数,解密blob,然后使用CNG读取PKCS#8,或者只是继续潜入兔子洞并享受文件解析器。
你处于“#34;相对简单"”的不幸融合之中。并且"比较辛苦"数学专业所知道的是#34;练习留给读者#34;
强烈考虑从EncryptedPrivateKeyInfo执行PFX方法。或者,您可以在自定义代码中执行此操作。自定义代码?好的,让我们这样做。此时您需要的参考文本是
好的,让我们继续。
byte[]
。对于第4步,有一些事情需要注意。具体来说,ASN.1 / DER INTEGER组件有两个RSAParameters不喜欢的规则。
.NET希望将值作为big-endian字节数组(与DER编码的字节顺序相同),具有以下关系:
确定哪些RFC为您的密钥格式定义了ASN.1结构,然后记住这一点并评估RSAPrivateKey部分。
DSAParameters和ECParameters都有自己的空间期望。
其中一些包括不总是优雅但经常运作的代码:
答案 1 :(得分:0)
Microsoft提供了一个SignedXML类来签名文件。要了解详情,请结帐https://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signedxml(v=vs.110).aspx