Статус: Участник
Группы: Участники
Зарегистрирован: 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. как реализовать шифрование?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,407  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 721 раз в 625 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 операции выполненные на массиве байт друг за другом, - будут соответствовать Крипто АРМ подписать и зашифровать?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,407  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 721 раз в 625 постах
|
Спросите это у разработчиков КриптоАРМа. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2012(UTC) Сообщений: 19 Откуда: Kazan RF
|
Спасибо большое за ответы. Пока, все нормально, жду финального тестирования!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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);
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,407  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 721 раз в 625 постах
|
Не очень понял вопрос - что требуется сделать? Получить 256 бит хэша от документа? или 64 байта подписи хэша? А зачем они Вам? Отредактировано пользователем 21 февраля 2012 г. 23:06:18(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 12.01.2012(UTC) Сообщений: 19 Откуда: Kazan RF
|
Цитата:Получить 256 бит хэша от документа? или 64 байта подписи хэша а я сам не понял, все что есть по документации я написал,Функция хеширования и т.д.... Клиент требует так подписывать сообщения. У меня есть старая реализация которую я переделываю и вот мне,не понятно что там именно происходит, я думал специалисты могут прояснить по коду. И тоже самое хочу реализовать, вытаскивая метод хеширования через сертификаты. Как с подписанием и шифрованием.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close