SignedCms.Decode() вызывает неверное значение тега ASN1.\r\n

Я занимаюсь проверкой цифровой подписи. И когда я пытался использовать SignedCms.Decode() , это вызывало System.Security.Cryptography.CryptographicException {"ASN1 bad tag value met.\r\n"}

Я генерирую данные подписи на Java и пытаюсь проверить их на С#.

Вот код С# для проверки подписи.

//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, не знаю откуда они.

Любой совет будет принят с благодарностью :)


person Ashkandi    schedule 04.03.2014    source источник


Ответы (1)


CR и LF не проблема; \r\n в сообщении об исключении является лишь частью сообщения об исключении. Настоящим симптомом является «плохой тег ASN1». Это связано с тем, что dotnet SignedCMS предназначен для данных криптографического синтаксиса сообщений (CMS), которые отличаются и НАМНОГО сложнее, чем простая подпись RSA, которую вы создали. Подробности см. в RFC 3369 и др.

Если вы действительно хотите использовать почти необработанную подпись (с дополнением PKCS # 1, как это делают почти все, включая Java, но не algid, идентификацию объекта / ключа, дополнительные данные, сертификаты, идентификацию типа и т. д.), вам нужно сделать что-то другое, чтобы получить его в Csharp. Я не могу помочь с этой частью.

Если вы хотите сгенерировать CMS SignedData на Java, см. раздел Подписать данные с помощью PKCS #7 в JAVA (BouncyCastle) или https://security.stackexchange.com/questions/13910/pkcs7-encoding-in-java-without-external-libs-like-bouncycastle-etc (расширение солнца).

Если вы не привязаны к Java, openssl (в легко переносимом C) также хорошо работает на CMS/PKCS#7.

person dave_thompson_085    schedule 04.03.2014
comment
Спасибо за вашу помощь. Ты прав. Сейчас я работаю над использованием PKCS#7. :) - person Ashkandi; 04.03.2014