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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Roberto1  
#1 Оставлено : 17 января 2012 г. 22:12:08(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

Здравствуйте.

Диклаймер: месяц знакомплюсь с КриптоПро и т.п.
С темой Noob-questions about Sharpei (выбор API) знаком и многими другими(

Задача: в клиентском приложении (.net3,5) требуется подписать и зашифровать файл аналогично как это делает КриптоАРМ по кнопке "Подписать и зашифровать".

Контора покупать Sharpei SDK отказалась, использовать утилиту cryptcp не согласны по техническим причинам.

Приходится как то через CryptoServiceProvider и т.д.

Ход мыслей такой:
1. достать сертификат( их хранилища сертификато windows)
2. у сертификата асиметрикалгоритм
3. алгоритмом формировать подпись.

Столкнулся с тем что сертификат генерированный на вашем тестовом сервере, предполагаю использовать его для подписания и шифрования.
Код:
Все политики выдачи
Все политики применения
Алгоритм подписи ГОСТ: Р 34.11/34.10-2001
Алгоритм хэширования подписи: ГОСТ Р 34.11-94
Открытый ключ: ГОСТ Р 34.10-2001(512 Bits)
Есть закрытый ключи для этого сертификата
Отпечаток: ‎47 0a 6e b0 38 2e 70 e1 91 4c 98 ba e3 ee 4f e3 97 d3 64 a1
Серийник: ‎94 3b 17 cd 26 a7 be 00


После загрузки в X509Certificate2 имеет в приватном ключе PrivateKey - тип CryptoPro.Sharpei.Gost3410CryptoServiceProvider.

по идее у него же должен быть метод signData или чето похожее он же от асинкалгоритм наследован!?

Код:

var a = (CryptoPro.Sharpei.Gost3410CryptoServiceProvider)sert.PrivateKey;
такой тип CryptoPro не известен, что надо предпринять что бы этот тип был? возможно ли к нему подцепиться?

4. как реализовать шифрование?
Offline Максим Коллегин  
#2 Оставлено : 17 января 2012 г. 22:20:10(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,407
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 721 раз в 625 постах
Знания в базе знаний, поддержка в центре поддержки
Offline Roberto1  
#3 Оставлено : 20 января 2012 г. 14:08:31(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

спасибо, статься изумительная.

Правильно ли я понял что
1. Это есть подписание, эквивалентное с криптоАрм подписать ?
Вывод массива байтов, соответствующего формату CMS

Код:
byte[] Sign(byte[] data, X509Certificate2 signingCert)
{
    // create ContentInfo
    ContentInfo content = new ContentInfo(data);

    // SignedCms represents signed data
    SignedCms signedMessage = new SignedCms(content);

    // create a signer
    CmsSigner signer = new CmsSigner(signingCert);

    // sign the data
    signedMessage.ComputeSignature(signer);

    // create PKCS #7 byte array
    byte[] signedBytes = signedMessage.Encode();

    // return signed data
    return signedBytes;
}


2. Это и есть шифрование, эквивалентное с крипто АРМ зашифровать?
Метод Encode

Код:
byte[] Encrypt(byte[] data, X509Certificate2 encryptingCert)
{
    // create ContentInfo
    ContentInfo plainContent = new ContentInfo(data);

    // EnvelopedCms represents encrypted data
    EnvelopedCms encryptedData = new EnvelopedCms(plainContent);

    // add a recipient
    CmsRecipient recipient = new CmsRecipient(encryptingCert);

    // encrypt data with public key of recipient
    encryptedData.Encrypt(recipient);

    // create PKCS #7 byte array
    byte[] encryptedBytes = encryptedMessage.Encode();

    // return encrypted data
    return encryptedBytes;
}


3. Эти 2 операции выполненные на массиве байт друг за другом, - будут соответствовать Крипто АРМ подписать и зашифровать?
Offline Максим Коллегин  
#4 Оставлено : 20 января 2012 г. 15:26:14(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,407
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 721 раз в 625 постах
Спросите это у разработчиков КриптоАРМа.
Знания в базе знаний, поддержка в центре поддержки
Offline Андрей Писарев  
#5 Оставлено : 20 января 2012 г. 15:46:32(UTC)
Андрей *

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

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

Сказал «Спасибо»: 579 раз
Поблагодарили: 2307 раз в 1807 постах
Цитата:
Эти 2 операции выполненные на массиве байт друг за другом, - будут соответствовать Крипто АРМ подписать и зашифровать?


да, КриптоАРМ расшифрует, проверит, покажет данные...


maxdm написал:
Спросите это у разработчиков КриптоАРМа.


Подписать и зашифровать: создается файл с именем оригинала +"sig.enc"
Его можно: расшифровать - тогда это будет подписанный файл с присоединенной ЭЦП

проверял на der-кодировке...

p.s. не забываем учет кодировки (der\base64) - если нужно расшифровывать и проверять ЭЦП созданные через КриптоАРМ (в нем можно указать разные на стадии подписания и шифрования)...



для режима base64 (подписать и зашифровать) будет создан в итоге файл с таким содержимым:
----- BEGIN PKCS7 ENCRYPTED -----
.... base64 ...
----- END PKCS7 ENCRYPTED -----

перекодируем из base64, далее расшифровываем содержимое, получаем опять в base64
----- BEGIN PKCS7 SIGNED -----
.... base64 ...
----- END PKCS7 SIGNED -----

перекодируем из base64, проверяем ЭЦП\извлекаем подписанные данные



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

Техническую поддержку оказываем тут
Наша база знаний
Offline Roberto1  
#6 Оставлено : 23 января 2012 г. 14:38:35(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

Спасибо большое за ответы.
Пока, все нормально, жду финального тестирования!
Offline Roberto1  
#7 Оставлено : 21 февраля 2012 г. 21:36:23(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

Добрый день!

Возник еще вопрос, подскажите пожалуйста.

ЭЦП формируется согласно требованиям ГОСТ Р 34.10-2001 ("Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи") и ГОСТ Р 34.11-94 ("Информационная технология. Криптографическая защита информации. Функция хэширования"). Программный продукт КриптоПро CSP 2.0 компании КриптоПро удовлетворяет указанным условиям. ЭЦП представляет собой строку, закодированную в BASE64 (RFC3548).

как нибудь можно реализовать хеширование аналогично (шифрованию с подписанием) ? не могу найти ничего похоже ни у CmsSigner ни у CmsRecipient, где CmsHasher?
Код:

byte[] Sign(byte[] data, X509Certificate2 signingCert)
byte[] Encrypt(byte[] data, X509Certificate2 encryptingCert)


в данный момент хеширование реализовано так.
Код:

            string retVal = "";
            IntPtr hCryptoProvider = IntPtr.Zero;
            IntPtr hPubKey = IntPtr.Zero;
            IntPtr hHash = IntPtr.Zero;
                ...               

                if (!Crypt32Wrapper.CryptAcquireContext(out hCryptoProvider, containerName, null, TYPE, 0))
                ...               
                int code = Crypt32Wrapper.CryptGetUserKey(hCryptoProvider, Crypt32Wrapper.AT_SIGNATURE, ref hPubKey);
                ...
                if (!Crypt32Wrapper.CryptCreateHash(hCryptoProvider, CERT_ALG_ID, IntPtr.Zero, 0, out hHash))
                ...
                byte[] buffer = encoding.GetBytes(toSign);
                if (!Crypt32Wrapper.CryptHashData(hHash, buffer, buffer.Length, 0))
                ...
                uint signatureLength = 0;
                if (!Crypt32Wrapper.CryptSignHash(hHash, Crypt32Wrapper.AT_KEYEXCHANGE, null, 0, null, ref signatureLength))
                ...
                byte[] signature = new byte[signatureLength];
                if (!Crypt32Wrapper.CryptSignHash(hHash, Crypt32Wrapper.AT_KEYEXCHANGE, null, 0, signature, ref signatureLength))

                retVal = Convert.ToBase64String(signature, 0, (int)signatureLength);
Offline Максим Коллегин  
#8 Оставлено : 21 февраля 2012 г. 23:05:27(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,407
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 721 раз в 625 постах
Не очень понял вопрос - что требуется сделать? Получить 256 бит хэша от документа? или 64 байта подписи хэша? А зачем они Вам?

Отредактировано пользователем 21 февраля 2012 г. 23:06:18(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline Roberto1  
#9 Оставлено : 22 февраля 2012 г. 13:43:53(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

Цитата:
Получить 256 бит хэша от документа? или 64 байта подписи хэша

а я сам не понял, все что есть по документации я написал,Функция хеширования и т.д....

Цитата:
А зачем они Вам?

Клиент требует так подписывать сообщения.

У меня есть старая реализация которую я переделываю и вот мне,не понятно что там именно происходит, я думал специалисты могут прояснить по коду.
И тоже самое хочу реализовать, вытаскивая метод хеширования через сертификаты. Как с подписанием и шифрованием.


Offline Roberto1  
#10 Оставлено : 28 февраля 2012 г. 14:24:35(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

вот что хочется сделать:
Код:

            using (var signer = (RSACryptoServiceProvider)certificate.PrivateKey)
                return Convert.ToBase64String(signer.SignData(Encoding.ASCII.GetBytes(data), "MD5"));


не получилось, при загрузке приват ключа из крипто про сертфиката ошибка следующая:

Цитата:

* System.NotSupportedException was unhandled
Message=Алгоритм ключа сертификата не поддерживается.
Source=System
StackTrace:
в System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
в testCryptoPRo.Program.Main(String[] args) в C:\Users\Robert\Documents\Visual Studio 2010\Projects\testCryptoPRo\testCryptoPRo\Program.cs:строка 26
в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:


Есть способы что бы подписать аналогично Crypt32Wrapper.CryptSignHash, используя возможности RSACryptoServiceProvider?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.