在Java中生成和编码PKCS7消息

时间:2012-04-24 15:05:11

标签: java digital-signature pkcs#7

我之前看过很多类似的问题,但我还没有找到合适的答案。

我收到了由C#SignedCms 生成和编码的签名。

我的目标是在Java中生成相同的签名。 我设法创建了一个类似的签名,它具有相同的长度和大部分数据。 但是在120到133位的位置上没有相同的位,并且持续大约250位。

根据这个Anatomy of PKCS#7 signed message。我有错误的签名和内容块。 我尝试了bouncycastle但我没有设法生成正确的签名。 我想使用sun。*类来生成和编码PKCS#7消息。

        X509Certificate x509 = siginingCert;
        PrivateKey priv = privateKeyFromPKCS12KeyStore;
        byte[] data = sha1HashOfDocument

        String digestAlgorithm = "MD5";
        String signingAlgorithm = "SHA1withRSA";

        AlgorithmId[] digestAlgorithmIds = new AlgorithmId[]{AlgorithmId.get(digestAlgorithm)};

        Signature sigSigner = Signature.getInstance(signingAlgorithm);
        sigSigner.initSign(priv);
        sigSigner.update(data);
        byte[] signedAttributes = sigSigner.sign();

        ContentInfo contentInfo = new ContentInfo(
                sun.security.pkcs.ContentInfo.DATA_OID,
                new DerValue(DerValue.tag_OctetString, data));

        X509Certificate[] certificates = {x509};

        BigInteger serial = x509.getSerialNumber();
        String issuerName = x509.getIssuerDN().getName();
        AlgorithmId dAlgId =  AlgorithmId.getAlgorithmId(digestAlgorithm);

        SignerInfo si = new SignerInfo(
                new X500Name(issuerName), serial, dAlgId, null,
                new AlgorithmId(AlgorithmId.RSAEncryption_oid),
                signedAttributes, null);

        SignerInfo[] signerInfos = {si};
        PKCS7 p7 = new PKCS7(digestAlgorithmIds, contentInfo, certificates, signerInfos);
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        p7.encodeSignedData(bytes);

我被困在这个问题上,我不知道我错过了什么。

感谢任何帮助。非常感谢。

1 个答案:

答案 0 :(得分:0)

byte[] signedData = signature.sign();

    SignerInfo si = new SignerInfo(
            new X500Name(issuerName), serial, dAlgId, null,
            new AlgorithmId(AlgorithmId.RSAEncryption_oid),
            signedAttributes,signedData  );