c# – 我如何使用RSA和SHA256与.NET签名文件?

我的应用程序将采取一组文件并签名。 (我不是试图签署一个程序集。)有一个.p12文件,我得到的私钥。

这是我试图使用的代码,但我得到一个System.Security.Cryptography.CryptographicException“指定的算法无效。

X509Certificate pXCert = new X509Certificate2(@"keyStore.p12", "password");
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)pXCert.PrivateKey;
string id = CryptoConfig.MapNameToOID("SHA256");
return csp.SignData(File.ReadAllBytes(filePath), id);

根据这answer它不能做(RSACryptoServiceProvider不支持SHA-256),但我希望它可能使用不同的库,如Bouncy城​​堡。

我是新的这个东西,我发现Bouncy城​​堡是非常混乱。我将一个Java应用程序移植到C#,我必须使用相同类型的加密来签署文件,所以我被困在RSA SHA256。

我如何使用Bouncy Castle,OpenSSL.NET,Security.Cryptography或另一个我没有听说过的第三方库?我假设,如果它可以在Java中完成,那么它可以在C#中完成。

更新:

这是我从poupou的anwser的链接

        X509Certificate2 cert = new X509Certificate2(KeyStoreFile, password");
        RSACryptoServiceProvider rsacsp = (RSACryptoServiceProvider)cert.PrivateKey;
        CspParameters cspParam = new CspParameters();
        cspParam.KeyContainerName = rsacsp.CspKeyContainerInfo.KeyContainerName;
        cspParam.KeyNumber = rsaCSP.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2;
        RSACryptoServiceProvider aescsp = new RSACryptoServiceProvider(cspParam);
        aescsp.PersistKeyInCsp = false;
        byte[] signed = aescsp.SignData(File.ReadAllBytes(file), "SHA256");
        bool isValid = aescsp.VerifyData(File.ReadAllBytes(file), "SHA256", signed);

问题是,我没有得到与原来的工具相同的结果。就我可以从阅读代码告诉CryptoServiceProvider做实际签名不使用私钥从密钥存储文件。那是对的吗?

RSA SHA256可以而且将工作…

你的后面的例子可能不会一直工作,它应该使用哈希算法的OID,而不是它的名字。根据你的第一个例子,这是从调用[CryptoConfig.MapNameToOID](AlgorithmName)1获得,其中AlgorithmName是你提供的(即“SHA256”)。

首先你需要的是带有私钥的证书。我通常使用公共密钥文件(.cer)从LocalMachine或CurrentUser存储中读取我的身份,以识别私钥,然后枚举证书并在哈希上匹配…

X509Certificate2 publicCert = new X509Certificate2(@"C:\mycertificate.cer");

//Fetch private key from the local machine store
X509Certificate2 privateCert = null;
X509Store store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
foreach( X509Certificate2 cert in store.Certificates)
{
    if (cert.GetCertHashString() == publicCert.GetCertHashString())
        privateCert = cert;
}

然而,你到达那里,一旦你获得了一个私钥的证书,我们需要重建它。这可能是必需的,因为证书创建它的私钥的方式,但我不确定为什么。无论如何,我们这样做首先导出密钥,然后重新导入它使用任何中间格式,你喜欢,最简单的是xml:

//Round-trip the key to XML and back, there might be a better way but this works
RSACryptoServiceProvider key = new RSACryptoServiceProvider();
key.FromXmlString(privateCert.PrivateKey.ToXmlString(true));

一旦完成,我们现在可以签名一个数据如下:

//Create some data to sign
byte[] data = new byte[1024];

//Sign the data
byte[] sig = key.SignData(data, CryptoConfig.MapNameToOID("SHA256"));

最后,可以使用证书的公钥直接进行验证,而无需像使用私钥那样进行重构:

key = (RSACryptoServiceProvider)publicCert.PublicKey.Key;
if (!key.VerifyData(data, CryptoConfig.MapNameToOID("SHA256"), sig))
    throw new CryptographicException();
http://stackoverflow.com/questions/7444586/how-can-i-sign-a-file-using-rsa-and-sha256-with-net

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 我如何使用RSA和SHA256与.NET签名文件?