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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline DawG  
#1 Оставлено : 8 июня 2015 г. 3:05:26(UTC)
DawG

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 10 раз
Хотелось бы узнать: возможно ли использовать закрытый ключ сертификата, чтобы шифровать/расшифровывать данные? Алгоритм не важен: асимметричный (открытым зашифровывать, закрытым расшифровывать) или симметричный (закрытым и шифровать, и расшифровывать).
Подписать данные закрытым ключом с помощью объекта CAPICOM.SignedData получилось, создав ссылку на контейнер с закрытым ключом:
Код:
privateKey.Open(pk.ContainerName, pk.ProviderName, PROV_GOST_2001_DH, CAPICOM.CAPICOM_KEY_SPEC.CAPICOM_KEY_SPEC_SIGNATURE, CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, false);


Шифровать пробывал с помощью объекта CAPICOM.EnvelopedData, но получал ошибку при расшифровывании закрытым ключом о том, что ключ не существует.
Где мог допустить ошибку? Или если есть другой способ использования закрытого ключа для шифрования - буду весьма признателен за информацию.
Заранее благодарю.
Offline Boris@Serezhkin.com  
#2 Оставлено : 8 июня 2015 г. 6:36:30(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
А причем здесь ключ?
CAPICOM прекрасно прячет работу с ключами.
ЗАШИФРОВАТЬ:
Код:
Public Function EnCryptB(b() As Byte, certName As String) As Byte()
'------------------------------------------------------------------------------
' Функиция EnCryptB зашифровывает b()
' certName = "aaa|bbb|....." могет быть несколько
' и возвращает зашифрованные данные
'------------------------------------------------------------------------------
Dim v             As Variant
Dim j             As Long
Dim rc    As Long
Dim xb()  As Byte
Dim EnvelopedData As capicom.EnvelopedData
Dim Recipient     As capicom.Certificate

' Создание объекта EnvelopedData.
Set EnvelopedData = New capicom.EnvelopedData

' Добавление получателей.
v = Split(certName, dlm)
For j = LBound(v) To UBound(v)
   Set Recipient = Me.GetCert("AddressBook", CStr(v(j))) 'нету - поисчем в MY
   If Recipient Is Nothing Then Set Recipient = Me.GetCert("My", CStr(v(j)))
   If Not (Recipient Is Nothing) Then EnvelopedData.Recipients.Add Recipient
Next j
If EnvelopedData.Recipients.Count = 0 Then
  mHasErr = -4
  mStrErr = "EnCryptB.getCert:  Not found Recipients = " & certName
  EnCryptB = xb
  Exit Function
End If
  
EnvelopedData.Content = b
EnCryptB = EnvelopedData.Encrypt(mOutType)

Set EnvelopedData = Nothing
Set Recipient = Nothing
Exit Function

Errs:
  mHasErr = Err.Number
  mStrErr = "EnCryptB: " & Err.Number & " - " & Err.Description
  EnCryptB = xb
End Function

РАСШИФРОВАТЬ:
Код:
Public Function DeСryptB(b() As Byte) As Byte()
' расшифровать, если Ок то вернуть Content иначе 0
'******************************************************************************
Dim EnvelopedData As capicom.EnvelopedData
Set EnvelopedData = New capicom.EnvelopedData
On Error GoTo Errs
EnvelopedData.Decrypt b
DeСryptB = EnvelopedData.Content
Set EnvelopedData = Nothing
Exit Function
Errs:
  mHasErr = Err.Number
  mStrErr = Err.Source & ": " & Err.Description
  DeСryptB = b
End Function

Для расшифровки используется сертификат из хранилища "MY"="Лишние"
т.е. хоть один сертификат из списка получателей должен быть установлен....

Точно так же подписать, проверить, снять подпись - не требует раьоты с ключами напрямую
достаточно получить контекст сертификата из хранилища.
thanks 1 пользователь поблагодарил Boris@Serezhkin.com за этот пост.
DawG оставлено 08.06.2015(UTC)
Offline Boris@Serezhkin.com  
#3 Оставлено : 8 июня 2015 г. 6:43:18(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
А если хочется поиграться с ключами, то

cls_CryptoAPI.rar (3kb) загружен 19 раз(а).
Offline DawG  
#4 Оставлено : 8 июня 2015 г. 7:10:20(UTC)
DawG

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 10 раз
Благодарю за ответ, но в вашем примере используется сертификат из хранилища сертификатов, а мне бы хотелось использовать неэскортируемый закрытый ключ, хранящийся на УЭК. Зашифровать получается без проблем (использование сертификата с открытым ключом), но вот расшифровать закрытым ключом у меня не выходит.
Offline Boris@Serezhkin.com  
#5 Оставлено : 8 июня 2015 г. 7:45:38(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Не вижу промблеммы через оснастку КриптоПро установить сертификат в хранилище "Лишние"
Через certmgr.msc убедиться что сказано "Есть" закрытый ключ. ну и расшифровывать....
КриптоПро само попросит вставить чтой-то куда-то...
Ну если очень хочется использовать не экспортируемый контейнер, без установки сертификата,
то это CriptoApi, а не CAPICOM

Отредактировано пользователем 8 июня 2015 г. 7:47:53(UTC)  | Причина: Не указана

Offline DawG  
#6 Оставлено : 8 июня 2015 г. 7:59:37(UTC)
DawG

Статус: Новичок

Группы: Участники
Зарегистрирован: 12.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 10 раз
Просто у меня подписать при помощи CAPICOM получилось закрытым ключом, поэтому подумал, что есть способ и зашифровать данные.
Не могли бы вы поделиться ссылкой на пример CryptoAPI, где поподробнее было бы описано, как получить ссылку на закрытый ключ, чтобы использовать его для шифрования.
Заранее благодарю.
Offline Андрей Писарев  
#7 Оставлено : 8 июня 2015 г. 8:09:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: DawG Перейти к цитате
Благодарю за ответ, но в вашем примере используется сертификат из хранилища сертификатов, а мне бы хотелось использовать неэскортируемый закрытый ключ, хранящийся на УЭК. Зашифровать получается без проблем (использование сертификата с открытым ключом), но вот расшифровать закрытым ключом у меня не выходит.


Ошибка и ее код - секретные?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#8 Оставлено : 8 июня 2015 г. 8:11:03(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: DawG Перейти к цитате
Просто у меня подписать при помощи CAPICOM получилось закрытым ключом, поэтому подумал, что есть способ и зашифровать данные.
Не могли бы вы поделиться ссылкой на пример CryptoAPI, где поподробнее было бы описано, как получить ссылку на закрытый ключ, чтобы использовать его для шифрования.
Заранее благодарю.


В SDK к CSP есть примеры работы с ключами для разных нужд.
Техническую поддержку оказываем тут
Наша база знаний
Offline Boris@Serezhkin.com  
#9 Оставлено : 8 июня 2015 г. 8:16:59(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Увы, не помню.
Но MSDN CryptAcquireContext
и т.д. и т.д.
Что-то встречалось....
Offline Андрей Писарев  
#10 Оставлено : 8 июня 2015 г. 8:24:55(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2034 раз в 1578 постах
Автор: DawG Перейти к цитате
Благодарю за ответ, но в вашем примере используется сертификат из хранилища сертификатов, а мне бы хотелось использовать неэскортируемый закрытый ключ, хранящийся на УЭК. Зашифровать получается без проблем (использование сертификата с открытым ключом), но вот расшифровать закрытым ключом у меня не выходит.


Получаете: Код ошибки: 2148073485 - Ключ не существует, так?
Потому что в контейнере есть только ключ подписи (нет ключа обмена).
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
DawG оставлено 08.06.2015(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.