每次我传递一个具有认证链(中间和根CA)的APK文件时,此代码都会失败。如果文件是自签名的,则它可以正常工作。
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)Cert.PublicKey.Key;
bool verified = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), vData)
“hash”是签名文件(SF)的sha1摘要,vData是签名的加密哈希值(CMSG_ENCRYPTED_DIGEST,),都是字节数组。
答案 0 :(得分:0)
我会在找到答案后回答我自己的问题。指定摘要方法时会出现问题。
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));
}