0

每次我将具有认证链(中间和根 CA)的 APK 文件传递​​给它时,此代码都会失败。如果文件是自签名的,则它可以正常工作。

RSACryptoServiceProvider csp = (RSACryptoServiceProvider)Cert.PublicKey.Key;
bool verified = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), vData)

“hash”是签名文件(SF)的sha1摘要,vData是签名的加密散列(CMSG_ENCRYPTED_DIGEST,),两者都是字节数组。

4

1 回答 1

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));
                        }
于 2013-10-02T17:14:33.807 回答