Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

7 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей Писарев  
#11 Оставлено : 28 декабря 2017 г. 13:23:39(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,322
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
в SDK нет примера?
Техническую поддержку оказываем тут
Наша база знаний
Offline po_saa  
#12 Оставлено : 28 декабря 2017 г. 13:40:19(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
в SDK нет примера?


пример из SDK
только как выяснилось он почему-то подписывает а не шифрует

Отредактировано пользователем 28 декабря 2017 г. 13:41:05(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#13 Оставлено : 28 декабря 2017 г. 13:54:31(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,322
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Автор: po_saa Перейти к цитате
Автор: Андрей * Перейти к цитате
в SDK нет примера?


пример из SDK
только как выяснилось он почему-то подписывает а не шифрует


Какой пример (название папки\файла) "подписывает, а не шифрует"?
Техническую поддержку оказываем тут
Наша база знаний
Offline po_saa  
#14 Оставлено : 28 декабря 2017 г. 14:28:48(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
Автор: po_saa Перейти к цитате
Автор: Андрей * Перейти к цитате
в SDK нет примера?


пример из SDK
только как выяснилось он почему-то подписывает а не шифрует


Какой пример (название папки\файла) "подписывает, а не шифрует"?


netsdk-x64-eng.msi -> C:\....\Крипто Про NET SDK\Examples\Simple\CMS\cs

StreamSign.cs -> public void Encode(X509Certificate2 cert, FileStream inFile,
FileStream outFile, bool detached)


StreamVerify.cs
StreamHelper.cs

и нужно, чтобы процедура только шифровала, но не подписывала

Отредактировано пользователем 28 декабря 2017 г. 14:41:23(UTC)  | Причина: Не указана

Offline po_saa  
#15 Оставлено : 10 января 2018 г. 18:10:15(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: po_saa Перейти к цитате
Автор: Андрей * Перейти к цитате
Автор: po_saa Перейти к цитате
Автор: Андрей * Перейти к цитате
в SDK нет примера?


пример из SDK
только как выяснилось он почему-то подписывает а не шифрует


Какой пример (название папки\файла) "подписывает, а не шифрует"?


netsdk-x64-eng.msi -> C:\....\Крипто Про NET SDK\Examples\Simple\CMS\cs

StreamSign.cs -> public void Encode(X509Certificate2 cert, FileStream inFile,
FileStream outFile, bool detached)


StreamVerify.cs
StreamHelper.cs

и нужно, чтобы процедура только шифровала, но не подписывала


fajjl zashifrovannyjj v potokovom rezhime.p7e.zip (24kb) загружен 6 раз(а). soourki_01.01.2017.zip.enc (299kb) загружен 3 раз(а).

приложил два файла:
soourki_01.01.2017.zip.enc - тот что получился из примера
файл зашифрованный в потоковом режиме.p7e.zip - файл, который правильно воспринимается КриптоАРМ

подскажите пожалуйста, что может быть в структуре не так и что надо изменить в примере, чтобы было одинаково?
Offline Андрей Писарев  
#16 Оставлено : 10 января 2018 г. 19:00:51(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,322
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
В указанном файле - пример для подписания.
Для шифрования - необходимо "написать код".

вместо CMSWin32.CMSG_SIGNED - использовать ENVELOPED
вместо SignedInfo использовать EnvelopedEncodeInfo (структура с информацией: алгоритм шифрования, сертификаты получателей..)

соответственно вызов будет с другими параметрами:
CryptMsgOpenToEncode ( .. CMSG_ENVELOPED .. CMSG_ENVELOPED_ENCODE_INFO )
Техническую поддержку оказываем тут
Наша база знаний
Offline po_saa  
#17 Оставлено : 10 января 2018 г. 20:52:25(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
В указанном файле - пример для подписания.
Для шифрования - необходимо "написать код".

вместо CMSWin32.CMSG_SIGNED - использовать ENVELOPED
вместо SignedInfo использовать EnvelopedEncodeInfo (структура с информацией: алгоритм шифрования, сертификаты получателей..)

соответственно вызов будет с другими параметрами:
CryptMsgOpenToEncode ( .. CMSG_ENVELOPED .. CMSG_ENVELOPED_ENCODE_INFO )


Спасибо за ответ.
Нужен очень и срочно.


структура ENVELOPED получилась у меня такая:

Код:
        [StructLayout(LayoutKind.Sequential)]
        public struct CMSG_ENVELOPED_ENCODE_INFO
        {
            public int cbSize;
            public IntPtr hCryptProv;
            public CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm;
            public IntPtr pvEncryptionAuxInfo;
            public int cRecipients;
            public IntPtr rgpRecipients;
            public IntPtr rgCmsRecipients;
            public int cCertEncoded;
            public IntPtr rgCertEncoded;
            public int cCrlEncoded;
            public IntPtr rgCrlEncoded;
            public int cAttrCertEncoded;
            public IntPtr rgAttrCertEncoded;
            public int cUnprotectedAttr;
            public IntPtr rgUnprotectedAttr;
        }


CryptMsgOpenToEncode не принимает ссылку на структуру ENVELOPED - только SIGNED

про ЭТО спросил глупость - надо было ещё переопределить вызов CryptMsgOpenToEncode - вот так:

public static extern IntPtr CryptMsgOpenToEncode(
int dwMsgEncodingType,
int dwFlags,
int dwMsgType,
ref CMSG_ENVELOPED_ENCODE_INFO pvMsgEncodeInfo,
String pszInnerContentObjID,
ref CMSG_STREAM_INFO pStreamInfo
);


Код:

                Int32 flags = 0;
                flags = CMSWin32.CMSG_CONTENTS_OCTETS_FLAG;

                hMsg = CMSWin32.CryptMsgOpenToEncode(
                    CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
                    flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
                    ref StreamInfo);


насколько я понимаю, в структуре CMSWin32.CMSG_ENVELOPED_ENCODE_INFO нужен только параметр cRecipients,
куда по идее надо поместить выбранные сертификаты с открытыми ключами (или/и) свой сертификат с закрытым ключом,
чтобы те в свою очередь могли их расшифровать
Зачем тогда там EnvelopedEncodeInfo.rgCertEncoded ?

я заполнил массив CertBlobs по количеству сертификатов и указатель на него
что делать с EnvelopedEncodeInfo.cRecipients ? (понятно, что здесь размер BLOBа)

Код:
                
// заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
                // заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
                EnvelopedEncodeInfo = new CMSWin32.CMSG_ENVELOPED_ENCODE_INFO();
                EnvelopedEncodeInfo.cbSize = Marshal.SizeOf(EnvelopedEncodeInfo);
                //распределяем память под структуру
                EnvelopedEncodeInfoPtr = Marshal.AllocHGlobal(
                    Marshal.SizeOf(EnvelopedEncodeInfo));
                Marshal.StructureToPtr(EnvelopedEncodeInfo, EnvelopedEncodeInfoPtr, false);
                //сертификат(ы) с публичным ключом, на котором (на которых) шифруем
                EnvelopedEncodeInfo.cCertEncoded  = CertBlobs.Length;
                CertBlobsPtr = Marshal.AllocHGlobal(
                    Marshal.SizeOf(CertBlobs[0]) * CertBlobs.Length);
                for (int i = 0; i < CertBlobs.Length; i++)
                {
                    Marshal.StructureToPtr(CertBlobs[i], new IntPtr(
                        CertBlobsPtr.ToInt64() +
                        (Marshal.SizeOf(CertBlobs[i]) * i)), false);
                }
                //это сертификаты получателя?!
                EnvelopedEncodeInfo.rgCertEncoded = CertBlobsPtr;
                //а тогда это что?
                EnvelopedEncodeInfo.cRecipients = ????????;
                EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;


и ещё вопрос
куда воткнуть Алгоритм?


... наверное так?:

EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;


ещё в CryptMsgOpenToEncode есть параметр flags:

Код:
                hMsg = CMSWin32.CryptMsgOpenToEncode(
                    CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
                    flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
                    ref StreamInfo);


определил его так:

flags = CMSWin32.CMSG_CONTENTS_OCTETS_FLAG;

Отредактировано пользователем 10 января 2018 г. 21:38:49(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#18 Оставлено : 10 января 2018 г. 21:50:31(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,322
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
>cRecipients

количество сертификатов

> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;

Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').

>flags
= 0

Техническую поддержку оказываем тут
Наша база знаний
Offline po_saa  
#19 Оставлено : 10 января 2018 г. 22:11:22(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
>cRecipients

количество сертификатов

> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;

Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').

>flags
= 0



получилось так:

Код:

        public void Encode(X509Certificate2 cert, FileStream inFile, 
            FileStream outFile, bool detached = false)
        {
            CMSWin32.CMSG_STREAM_INFO StreamInfo;
            CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
            CMSWin32.CERT_CONTEXT[] CertContexts = null;
            CMSWin32.BLOB[] CertBlobs;

            X509Chain chain = null;
            X509ChainElement[] chainElements = null;
            X509Certificate2[] certs = null;
            AsymmetricAlgorithm key = null;
            ICspAsymmetricAlgorithm ikey = null;
            GCHandle gchandle = new GCHandle();

            IntPtr hProv = IntPtr.Zero;
            IntPtr SignerInfoPtr = IntPtr.Zero;
            IntPtr EnvelopedEncodeInfoPtr = IntPtr.Zero;
            IntPtr CertBlobsPtr = IntPtr.Zero;
            IntPtr hMsg = IntPtr.Zero;
            IntPtr pbPtr = IntPtr.Zero;
            Byte[] pbData;
            long dwFileSize;
            long dwRemaining;
            int dwSize;
            Boolean bResult = false;

            try
            {
                // Размер файла.
                dwFileSize = inFile.Length;
                // Блок кодирования
                pbData = new byte[BlockSize];

                // поток закодированных данных
                m_callbackFile = outFile;

                if (cert != null)   //если сертификат
                {
                    // Строим цепочку сертификатов.
                    chain = new X509Chain(true);
                    chain.Build(cert);
                    chainElements = new X509ChainElement[
                        chain.ChainElements.Count];
                    chain.ChainElements.CopyTo(chainElements, 0);

                    // Сворачиваем цепочку в массив
                    certs = new X509Certificate2[chainElements.Length/* !! */]; //=====================================================
                    for (int i = 0; i < chainElements.Length /* !! */; i++)
                    {
                        certs[i] = chainElements[i].Certificate;
                    }
                }
                else
                {
                    //пользоваться commonX509Certificale2Collection
                    certs = new X509Certificate2[commonX509Certificate2Collection.Count];
                    commonX509Certificate2Collection.CopyTo(certs, 0);
                }

                // Получаем Win32 контексты сертификатов
                CertContexts = new CMSWin32.CERT_CONTEXT[certs.Length];
                for (int i = 0; i < certs.Length; i++)
                {
                    CertContexts[i] = (CMSWin32.CERT_CONTEXT)
                        Marshal.PtrToStructure(certs[i].Handle, 
                        typeof(CMSWin32.CERT_CONTEXT));
                }

                // Получаем все сертификаты в виде BLOB
                CertBlobs = new CMSWin32.BLOB[CertContexts.Length];
                for (int i = 0; i < CertContexts.Length; i++)
                {
                    CertBlobs[i].cbData = CertContexts[i].cbCertEncoded;
                    CertBlobs[i].pbData = CertContexts[i].pbCertEncoded;
                }

                // заполняется структура CMSWin32.CMSG_ENVELOPED_ENCODE_INFO EnvelopedEncodeInfo;
                EnvelopedEncodeInfo = new CMSWin32.CMSG_ENVELOPED_ENCODE_INFO();
                EnvelopedEncodeInfo.cbSize = Marshal.SizeOf(EnvelopedEncodeInfo);
                //распределяем память под структуру
                EnvelopedEncodeInfoPtr = Marshal.AllocHGlobal(
                    Marshal.SizeOf(EnvelopedEncodeInfo));
                Marshal.StructureToPtr(EnvelopedEncodeInfo, EnvelopedEncodeInfoPtr, false);
                //сертификат(ы) с публичным ключом, на котором (на которых) шифруем
                EnvelopedEncodeInfo.cCertEncoded  = CertBlobs.Length;
                CertBlobsPtr = Marshal.AllocHGlobal(
                    Marshal.SizeOf(CertBlobs[0]) * CertBlobs.Length);
                for (int i = 0; i < CertBlobs.Length; i++)
                {
                    Marshal.StructureToPtr(CertBlobs[i], new IntPtr(
                        CertBlobsPtr.ToInt64() +
                        (Marshal.SizeOf(CertBlobs[i]) * i)), false);
                }
                //это сертификаты получателя
                EnvelopedEncodeInfo.rgCertEncoded = CertBlobsPtr;
                //это количество сертификатов
                EnvelopedEncodeInfo.cRecipients = CertBlobs.Length;
                EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = "1.2.643.2.2.21";


                // Заполняем структуру StreamInfo
                StreamInfo = new CMSWin32.CMSG_STREAM_INFO();
                if( dwFileSize > Int32.MaxValue )
                    StreamInfo.cbContent = -1; // Используем BER
                else
                    StreamInfo.cbContent = (int)dwFileSize; // Используем DER
                StreamInfo.pfnStreamOutput = new 
                    CMSWin32.StreamOutputCallbackDelegate(StreamOutputCallback);

                // Открываем сообщение для кодирования
                Int32 flags = 0;    //должен быть 0!

                hMsg = CMSWin32.CryptMsgOpenToEncode(
                    CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
                    flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
                    ref StreamInfo);

                if (hMsg.Equals(IntPtr.Zero))
                {
                    throw new CryptographicException(
                        "CryptMsgOpenToEncode error #" + 
                        Marshal.GetLastWin32Error().ToString(), 
                        new Win32Exception(Marshal.GetLastWin32Error()));
                }

                // Поблочная обработка сообщения
                gchandle = GCHandle.Alloc(pbData, GCHandleType.Pinned);
                pbPtr = gchandle.AddrOfPinnedObject();
                dwRemaining = dwFileSize;
                if (dwFileSize < BlockSize)
                    dwSize = (int)dwFileSize;
                else
                    dwSize = BlockSize;
                while (dwRemaining > 0)
                {
                    inFile.Read(pbData, 0, dwSize);
                    // Вызываем обработку блока
                    bResult = CMSWin32.CryptMsgUpdate(
                        hMsg, 
                        pbPtr, 
                        dwSize,
                        (dwRemaining <= dwSize) ? true : false );

                    if (!bResult)
                    {
                        throw new CryptographicException(
                            "CryptMsgUpdate error #" + 
                            Marshal.GetLastWin32Error().ToString(), 
                            new Win32Exception(Marshal.GetLastWin32Error()));
                    }

                    // Переходим к следующему блоку
                    dwRemaining -= dwSize;
                    if (dwRemaining < dwSize)
                    {
                        dwSize = (int)dwRemaining;
                    }
                    if (progress != null)
                        progress(dwFileSize, dwRemaining);
                }
            }
            finally
            {
                // Чистим
                if (gchandle.IsAllocated)
                {
                    gchandle.Free();
                }
                if (!CertBlobsPtr.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(CertBlobsPtr);
                }
                
                if (!EnvelopedEncodeInfoPtr.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(EnvelopedEncodeInfoPtr);
                }

                if (!hProv.Equals(IntPtr.Zero))
                {
                    CMSWin32.CryptReleaseContext(hProv, 0);
                }
                if (!hMsg.Equals(IntPtr.Zero))
                {
                    CMSWin32.CryptMsgClose(hMsg);
                }
            }
        }


собирается

попробую завтра сранья...

ах, да! почистить забыл
Код:

                if (!EnvelopedEncodeInfoPtr.Equals(IntPtr.Zero))
                {
                    Marshal.FreeHGlobal(EnvelopedEncodeInfoPtr);
                }

Отредактировано пользователем 10 января 2018 г. 22:41:20(UTC)  | Причина: Не указана

Offline po_saa  
#20 Оставлено : 11 января 2018 г. 9:00:31(UTC)
po_saa

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.08.2015(UTC)
Сообщений: 90
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 6 раз
Автор: Андрей * Перейти к цитате
>cRecipients

количество сертификатов

> ContentEncryptionAlgorithm.pszObjId = CMSWin32.szOID_CP_GOST_R3411;

Прочитать еще раз и написать алгоритм шифрования ( _GOST89 = '1.2.643.2.2.21').

>flags
= 0



Код:
                hMsg = CMSWin32.CryptMsgOpenToEncode(
                    CMSWin32.X509_ASN_ENCODING | CMSWin32.PKCS_7_ASN_ENCODING,
                    flags, CMSWin32.CMSG_ENVELOPED, ref EnvelopedEncodeInfo, null,
                    ref StreamInfo);


выдаёт ошибку 1008

{System.ComponentModel.Win32Exception (0x80004005): Попытка ссылки на несуществующий токен}

Ошибка -2147024809


нашел примерчик:

https://www.cryptopro.ru....aspx?g=posts&t=6714

тут заполняется-таки Recipient

Отредактировано пользователем 11 января 2018 г. 9:49:01(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
7 Страницы<1234>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.