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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
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) загружен 17 раз(а).
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)
Сообщений: 10,640
Мужчина
Российская Федерация

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


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

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: 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)
Сообщений: 10,640
Мужчина
Российская Федерация

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


Получаете: Код ошибки: 2148073485 - Ключ не существует, так?
Потому что в контейнере есть только ключ подписи (нет ключа обмена).
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
DawG оставлено 08.06.2015(UTC)
Offline Андрей Писарев  
#11 Оставлено : 8 июня 2015 г. 8:29:43(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: Boris@Serezhkin.com Перейти к цитате
Увы, не помню.
Но MSDN CryptAcquireContext
и т.д. и т.д.
Что-то встречалось....


Для этого есть SDK от КриптоПРО или на сайте посмотреть...
http://cpdn.cryptopro.ru/
Цитата:

КриптоПро CSP\ Интерфейс криптопровайдера "КриптоПро CSP 3.9"
Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Коллегин  
#12 Оставлено : 8 июня 2015 г. 14:14:08(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 18 раз
Поблагодарили: 612 раз в 545 постах
В УЭК только ключ подписи. Шифровать в адрес его не получится.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
DawG оставлено 08.06.2015(UTC)
Offline Boris@Serezhkin.com  
#13 Оставлено : 8 июня 2015 г. 15:14:50(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Т.е. сертификат - состав - использование ключа
и там не сказано шифрование данных ?
Тогда Ой.
Offline Андрей Писарев  
#14 Оставлено : 8 июня 2015 г. 15:16:11(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: Boris@Serezhkin.com Перейти к цитате
Т.е. сертификат - состав - использование ключа
и там не сказано шифрование данных ?
Тогда Ой.


Да (или тип посмотреть программно: AT_SIGNATURE будет, вместо at_keyexchange)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
DawG оставлено 08.06.2015(UTC)
Offline Boris@Serezhkin.com  
#15 Оставлено : 8 июня 2015 г. 17:45:59(UTC)
Boris@Serezhkin.com

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Цитата:
В УЭК только ключ подписи. Шифровать в адрес его не получится.

А если пофантазировать? На основе открытого ключа и контейнера сформировать
самоподписаный сертификат? И попытаться расшифровать им?
Dancing
Offline Андрей Писарев  
#16 Оставлено : 8 июня 2015 г. 18:05:57(UTC)
Андрей *

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

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

Сказал «Спасибо»: 391 раз
Поблагодарили: 1610 раз в 1237 постах
Автор: Boris@Serezhkin.com Перейти к цитате
Цитата:
В УЭК только ключ подписи. Шифровать в адрес его не получится.

А если пофантазировать? На основе открытого ключа и контейнера сформировать
самоподписаный сертификат? И попытаться расшифровать им?
Dancing


Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Коллегин  
#17 Оставлено : 8 июня 2015 г. 18:53:05(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 18 раз
Поблагодарили: 612 раз в 545 постах
А зачем фантазировать?
Генерите эфемерный ключ, открытый подписываете ключом УЭК и высылаете отправителю. Отправитель шифрует в адрес Вашего эфемерного ключа. Профит.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
DawG оставлено 08.06.2015(UTC)
Offline DawG  
#18 Оставлено : 8 июня 2015 г. 19:43:52(UTC)
DawG

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

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

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


Получаете: Код ошибки: 2148073485 - Ключ не существует, так?
Потому что в контейнере есть только ключ подписи (нет ключа обмена).


Извините за столь долгий ответ. У меня почему-то кода ошибки нет, но сама ошибка такая.
Правильно понимаю, что у меня не получится закрытым ключом подписи пользоваться при шифровании?
Мне бы хотелось зашифровать некоторую строку, и иметь возможность расшифровать её только при наличии УЭК. Есть какой-либо способ, с помощью которого можно было бы это реализовать?
Offline Андрей Писарев  
#19 Оставлено : 9 июня 2015 г. 11:21:06(UTC)
Андрей *

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

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

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


Получаете: Код ошибки: 2148073485 - Ключ не существует, так?
Потому что в контейнере есть только ключ подписи (нет ключа обмена).


Извините за столь долгий ответ. У меня почему-то кода ошибки нет, но сама ошибка такая.
Правильно понимаю, что у меня не получится закрытым ключом подписи пользоваться при шифровании?
Мне бы хотелось зашифровать некоторую строку, и иметь возможность расшифровать её только при наличии УЭК. Есть какой-либо способ, с помощью которого можно было бы это реализовать?


Через COM от MS нет.
А через CryptoAPI - уже был дан совет
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
DawG оставлено 10.06.2015(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.