我有以下问题:
我的应用程序收到带有公钥,RSA编码(带私钥)sha256签名和一堆数据的证书。
我必须检查数据的sha256哈希是否与RSA编码的哈希相同。 它看起来像:
bool checkSHA(X509Certificate2 certificate, byte[] RsaSHASign, byte[] dataToCheck)
{
byte[] publicKey = certificate.GetPublicKey();
RSACryptoServiceProvider crsa = new RSACryptoServiceProvider();
//Get an instance of RSAParameters from ExportParameters function.
RSAParameters RSAKeyInfo = crsa.ExportParameters(true);
//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = publicKey;
//Import key parameters into RSA.
crsa.ImportParameters(RSAKeyInfo);
SHA256 sha = SHA256.Create();
byte[] hashValue1 = sha.ComputeHash(dataToCheck);
string OID = CryptoConfig.MapNameToOID("SHA256");
//here I must check if the counted hash is the same as the one passed as RSA encoded
return crsa.VerifyData(RsaSHASign, OID, hashValue1);
}
我真正需要的是在 Rsa编码之前的哈希值,但我想如果没有私钥就不可能。
不幸的是,即使我知道散列是相同的(在RSA之前),VerifyData总是返回false。我真的被卡住了:(
我希望解决方案并不困难,但不知何故无法弄明白。 我尝试使用BouncyCastle和openssl包装但是没有成功
答案 0 :(得分:0)
我用这种方式:
X509Certificate2 Pe = new X509Certificate2(Pe_file);
RSACryptoServiceProvider rsa_e = (RSACryptoServiceProvider)Pe.PublicKey.Key;
if (rsa_e.VerifyHash(hash, "SHA256", data))
{
Debug.Print("OK");
}
hash
是已验证数据的SHA256哈希值。 data
是验证的签名。