0
これまでによく似た質問がたくさんありましたが、まだ適切な答えが見つかりませんでした。JavaでPKCS7メッセージを生成してエンコードする
私はC#SignedCmsによって生成され、コード化された署名を取得しました。
私の目標は、Javaで同じシグネチャを生成することです。 同じ長さとそのデータの大部分を持つ同様の署名を作成することができました。 しかし、120〜133ビットと最後の約250ビットの位置に同じビットはありません。
これによれば、Anatomy of PKCS#7 signed message。私は署名と内容のブロックが間違っています。 私はバウンシーキャスルを試みましたが、正しいシグネチャを生成することはできませんでした。 私はsuns. *クラスを使用して、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);
私はこの問題を抱えていましたが、私が逃したものは何も分かりません。
何か助けていただければ幸いです。どうもありがとう。
http://stackoverflow.com/questions/11013111/java-implementation-of-c-sharp-signedcmsはこれと似ています – nixspirit