【发布时间】:2018-08-01 00:09:02
【问题描述】:
不使用第 3 方 BouncyCastle 库,有没有办法读取自定义私钥并签署消息? (sha256 hash+使用私钥加密)
【问题讨论】:
标签: c# rsa signature sha256 digital
不使用第 3 方 BouncyCastle 库,有没有办法读取自定义私钥并签署消息? (sha256 hash+使用私钥加密)
【问题讨论】:
标签: c# rsa signature sha256 digital
从技术上讲,是的。根据您拥有的密钥类型,答案会变得更加棘手。
编辑(2019 年至 10 月):.NET Core 3.0 以 DER 编码(相对于 PEM 编码)形式内置了对所有这些格式的支持。我在每种文件格式的子标题后添加了 .NET Core 3.0+ 答案。
如果您有这种类型的文件,并且您使用的是 .NET 4.6 或更高版本,那么可以。您需要使用 DER 编码(相对于 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。
ImportPkcs8PrivateKey 方法在 AsymmetricAlgorithm 上声明,所有非对称内置类型(RSA、DSA、ECDsa、ECDiffieHellman)都支持它。
using (RSA rsa = RSA.Create())
{
rsa.ImportPkcs8PrivateKey(blob, out _);
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
恭喜,您的私钥传输功能强大。可悲的是,如果您想实际处理它,这需要编写最大数量的代码。你不想处理它。你真的,真的,想要
请参阅How is a private key encrypted in a pem certificate?,然后继续阅读下一节的艰难入门知识。不过,你要做的工作比它所说的要多得多。您需要读取文件,了解加密方案和参数,解密 blob,然后使用 CNG 读取 PKCS#8,或者继续潜入兔子洞并享受您的文件解析器。
ImportEncryptedPkcs8PrivateKey 方法在 AsymmetricAlgorithm 上声明,所有非对称内置类型(RSA、DSA、ECDsa、ECDiffieHellman)都支持它。
using (RSA rsa = RSA.Create())
{
rsa.ImportEncryptedPkcs8PrivateKey(password, blob, out _);
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
不幸的是,你正处于“相对简单”和“相对困难”的不幸交汇处,这被数学专业的学生称为“留给读者的练习”。
强烈考虑从 EncryptedPrivateKeyInfo 执行 PFX 方法。或者,您可以在自定义代码中执行此操作。自定义代码?好的,让我们这样做。此时您需要的参考文本是
好的,我们继续。
byte[] 键对象。对于第 4 步,需要注意一些事项。具体来说,ASN.1/DER INTEGER 组件有两个 RSAParameters 不喜欢的规则。
.NET 希望将值作为大端字节数组(与 DER 编码的字节顺序相同)具有以下关系:
ImportRSAPrivateKey 方法在 RSA 上声明,由于它解析数据并调用 ImportParameters,它适用于所有 RSA 派生类型(假设它们已经支持参数导入)。
using (RSA rsa = RSA.Create())
{
rsa.ImportRSAPrivateKey(blob, out _);
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
确定 RFC 为您的密钥格式定义的 ASN.1 结构,然后牢记这一点并评估 RSAPrivateKey 部分。
DSAParameters 和 ECParameters 都有自己的空间期望。
其中一些包括并非总是优雅但经常运行的代码:
【讨论】:
Microsoft 提供了一个类 SignedXML 来对文件进行签名。想了解更多,请查看https://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signedxml(v=vs.110).aspx
【讨论】: