0

以前にも同様の質問が数多く寄せられましたが、まだ適切な回答が見つかりませんでした。

C# SignedCmsによって生成およびエンコードされた署名を取得しました。

私の目標は、Java で同じ署名を生成することです。同じ長さとほとんどのデータを持つ同様の署名を作成することができました。ただし、120 ~ 133 ビットの位置に同じビットはなく、約 250 ビット続きます。

このPKCS#7 署名付きメッセージの解剖学 によると。署名とコンテンツ ブロックが間違っています。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);

私はこの問題に行き詰まってしまい、何を見逃したのかわかりません。

4

1 に答える 1