Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 VS10 C# проблема с проверкой подписи CryptoPro  [new]
alx71
Member

Откуда:
Сообщений: 390
Письмо e-mail зашифровано и подписано CryptoPro. OutLook Express с ним работает нормально.
Во вложении - один файл smime.p7m. Считываю и обрабатываю его:

// data - зашифрованные данные, файл smime.p7m
// dec - дешифрованные
        public static bool Decrypt(byte[] data, out byte[] dec)
        {
            EnvelopedCms envelopedCms = new EnvelopedCms();
            try
            {
                envelopedCms.Decode(data);
                envelopedCms.Decrypt();
                dec = envelopedCms.ContentInfo.Content;
                ContentInfo contentInfo = new ContentInfo(dec);
                SignedCms signedCms = new SignedCms(contentInfo, true);

                signedCms.CheckSignature(true); // тут возникает ошибка Сообщение CMS не подписано

                foreach (SignerInfo signerInfo in signedCms.SignerInfos)
                {
                    signedCms.RemoveSignature(signerInfo);
                }
                return true;
            }
            catch (CryptographicException)
            {
                 ...
                dec = null;
                return false;
            }
            catch (Exception ex)
            {
                 ...
            }
        }

Дешифруется вроде нормально, к дискете обращается, ошибок не возникает, а подписей не видит.

В чем я неправ?
10 июн 11, 11:42    [10794561]     Ответить | Цитировать Сообщить модератору
 Re: VS10 C# проблема с проверкой подписи CryptoPro  [new]
alx71
Member

Откуда:
Сообщений: 390
Правильно:


        public static bool Decrypt(byte[] data, out byte[] dec, out SignInfo [] signInfo)
        {
            EnvelopedCms envelopedCms = new EnvelopedCms();
            try
            {
                envelopedCms.Decode(data);
                envelopedCms.Decrypt();
                dec = envelopedCms.ContentInfo.Content;

                /*
                после расшифрования в dec должно быть
                Content-Type: application/x-pkcs7-mime; name="smime.p7m"
                Content-Disposition: attachment; filename="smime.p7m"
                Content-Transfer-Encoding: base64
                пустая строка
                и далее данные в base64
                Эти данные надо декодировать
                 */

                /* ... тут отделяем заголовок ... */

                byte[] test_sign = System.Convert.FromBase64String(...); // декодируем данные
               // теперь у нас в test_sign - данные с подписями

                SignedCms signedCms = new SignedCms();
                signedCms.Decode(test_sign);

                int NumberSign = 0;
                signInfo = new SignInfo[signedCms.SignerInfos.Count];

                foreach (SignerInfo signerInfo in signedCms.SignerInfos)
                {
                    // проходим по подписям и проверяем их
                    signInfo[NumberSign] = new SignInfo(signerInfo); ;
                    signInfo[NumberSign].Result = "Ok";
                    try
                    {
                        signerInfo.CheckSignature(true);
                    }
                    catch (Exception ex)
                    {
                        int ns = NumberSign + 1;
                        signInfo[NumberSign].Result = "Ошибка проверки подписи " + ns + " " + ex.Message;
                    }
                    // и сразу удаляем
                    signedCms.RemoveSignature(signerInfo);
                    NumberSign++;
                }
                dec = signedCms.ContentInfo.Content;


            }
            catch (CryptographicException)
            {
                 ...
                dec = null;
                return false;
            }
            catch (Exception ex)
            {
                 ...
            }
        }
15 июл 11, 05:44    [10977469]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить