SignedCms.Decode()导致“ASN1错误标记值满足。\ r \ n”

时间:2014-03-04 03:19:06

标签: c# java signature carriage-return linefeed

我正在做验证数字签名。当我试图使用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,我不知道它们来自哪里。

非常感谢任何建议:)

1 个答案:

答案 0 :(得分:0)

CR和LF没问题;异常消息中的\ r \ n只是异常消息的一部分。真正的症状是“ASN1坏标签”。这是因为dotnet SignedCMS用于加密消息语法(CMS)数据,这种方式与您创建的简单RSA签名相比更加复杂。有关详细信息,请参阅RFC 3369等。

如果你真的想使用近原始签名(PKCS#1填充几乎包括Java在内的所有人,但不是algid,实体/密钥识别,附加数据,证书,类型识别等)你会需要做一些不同的事情才能在Csharp中接收它。我无法帮助你。

如果您想用Java生成CMS SignedData,请参阅Sign data using PKCS #7 in JAVA(BouncyCastle)或https://security.stackexchange.com/questions/13910/pkcs7-encoding-in-java-without-external-libs-like-bouncycastle-etc(sun扩展名)。

如果您没有与Java结合,openssl(在高度可移植的C中)也可以在CMS / PKCS#7上做得很好。