找到答案后,我会回答我自己的问题。指定摘要方法时存在问题。
X509 证书使用两种可能不一致的算法(SignatureAlgorithm.FriendlyName 和 PublicKey.Key.SignatureAlgorithm)。验证哈希时,您必须确保它与证书的 SignatureAlgorithm 匹配,而不是与公钥中使用的算法匹配(这是我的错)。
如果有疑问,请同时检查:
if (cert.SignatureAlgorithm.FriendlyName.ToString().Contains("sha256"))
{
SHA256Managed sha256 = new SHA256Managed();
byte[] hash256 = sha256.ComputeHash(sig);
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
verify_all.Add(csp.VerifyHash(hash256, CryptoConfig.MapNameToOID("SHA256"), vData));
}
else if (cert.SignatureAlgorithm.FriendlyName.ToString().Contains("sha1"))
{
SHA1Managed Sha1 = new SHA1Managed();
byte[] hash1 = sha1.ComputeHash(sig);
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
verify_all.Add(csp.VerifyHash(hash1, CryptoConfig.MapNameToOID("SHA256"), vData));
}