当BouncyCastle的SignerInformation.verify()方法返回false时,它到底意味着什么?

时间:2017-05-04 13:34:53

标签: bouncycastle signature verify smime

我正在开发一个程序的开源版本,以便解密和验证电子邮件。

到目前为止,我遇到了客户的一些s / mime消息,这些消息无法验证(约1%)。代码没什么特别的。 (" SignInfos"是包含一些信息的自定义类型)

private SignInfos verify(SMIMESigned s, String pubcertfile)
{
    try {
        Security.addProvider(new BouncyCastleProvider());
        Store certs = s.getCertificates(); 
        SignerInformationStore signers = s.getSignerInfos();
        Collection<SignerInformation> c = signers.getSigners();
        Iterator<SignerInformation> it = c.iterator();
        while (it.hasNext()) {
            SignerInformation signer = (SignerInformation) it.next();
            Collection certCollection = certs.getMatches(signer.getSID());
            Iterator certIt = certCollection.iterator();
            X509CertificateHolder ch = (X509CertificateHolder) certIt.next();
            X509Certificate cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(ch);
            JcaSimpleSignerInfoVerifierBuilder verifier = new JcaSimpleSignerInfoVerifierBuilder();
            verifier.setProvider("BC");
            SignerInformationVerifier siv = verifier.build(cert);
            if (signer.verify(siv)) {
                si.ok = true;
            } else {
                si.ok = false;
                si.errortext = "Verification failed";
            }
        }
        return si;
    } catch (Exception e) {
        logIt("Exception in verify: " + e.getMessage());
        return si
    }
}

我搜索了互联网,我对线端格式和编码感到困惑。什么都没有帮助。我还将给定的证书信息与签名中提供的证书进行了比较。它是一样的。一切都很好。

然后我尝试操纵一个字符。发生了什么? verify()方法将引发异常&#34;消息摘要属性值与计算值&#34;不匹配!

所以我问自己差异在哪里。在第一种情况下,摘要应该是正确的,否则该方法会提升我上面提到的例外。

有什么想法吗?

提前致谢!

PS 对不起,我无法在这里向客户提供原始信息。

0 个答案:

没有答案
相关问题