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 用于加密消息语法 (CMS) 数据,这与您创建的简单 RSA 签名相比有很大不同,而且要复杂得多。有关详细信息,请参阅 RFC 3369 等。

如果您真的想使用接近原始的签名(使用 PKCS#1 填充,包括 Java 在内的几乎所有人都这样做,但不是 algid、实体/密钥标识、附加数据、证书、类型标识等),您需要做在 Csharp 中接收不同的东西。我对那部分无能为力。

如果要在 Java 中生成 CMS SignedData,请参阅在 JAVA (BouncyCastle)中使用 PKCS #7 签署数据或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 回答