我正在做验证数字签名。当我试图使用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 return
和line feed
,我不知道它们来自哪里。
非常感谢任何建议:)
答案 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上做得很好。