0

デジタル署名の検証について行っています。そして、私が使用しようとしたときにSignedCms.Decode() 、それが原因でしたSystem.Security.Cryptography.CryptographicException {"ASN1 bad tag value met.\r\n"}

Java で署名データを生成し、C# で検証しようとしています。

署名を検証するための C# コードを次に示します。

//base64 signature data
string encodedMessage_b64 = "ahXwmjFNUVxxxxxx==";
byte[] encodedMessage = Convert.FromBase64String(encodedMessage_b64);
SignedCms signedCms = new SignedCms();
//throw exception
signedCms.Decode(encodedMessage);

そして、これが署名を生成するための Java コードです。

Signature rsaSig = Signature.getInstance("SHA1withRSA");
//privateKey from keytore
rsaSig.initSign(priKey);
rsaSig.update(data.getBytes());
//org.apache.commons.codec.binary.Base64;
String signedData = Base64.encodeBase64String(rsaSig.sign());

問題はcarriage returnline feedどこから来たのかわかりません。

どんなアドバイスでも大歓迎です:)

4

1 に答える 1

0

CR と LF は問題ありません。例外メッセージの \r\n は、例外メッセージの一部にすぎません。本当の症状は「ASN1 不良タグ」です。これは、dotnet SignedCMS が Cryptographic Message Syntax (CMS) データ用であるためです。これは、作成した単純な RSA 署名とは大きく異なり、はるかに複雑です。詳細については、RFC 3369 などを参照してください。

ほぼ生の署名を本当に使用したい場合 (Java を含むほぼすべての人が行うように PKCS#1 パディングを使用しますが、algid、エンティティ/キーの識別、追加のデータ、証明書、型の識別などは使用しません) を行う必要があります。 Csharp で受信するには別の方法があります。私はその部分を手伝うことはできません。

Java で CMS SignedData を生成する場合は、Java でPKCS #7 を使用してデータに署名する(BouncyCastle) またはhttps://security.stackexchange.com/questions/13910/pkcs7-encoding-in-java-without-external-libsを参照してください。 -like-bouncycastle-etc (太陽拡張)。

Java に慣れていない場合は、openssl (移植性の高い C) も CMS/PKCS#7 でうまく機能します。

于 2014-03-04T04:35:41.903 に答える