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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline motogarri  
#1 Оставлено : 23 августа 2012 г. 21:40:26(UTC)
motogarri

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

Группы: Участники
Зарегистрирован: 03.08.2012(UTC)
Сообщений: 28

Они по разным алгоритмам вычисляются или CAPICOM как-то кодирует по своему?


Код:
CryptCreateHash(hProv, CALG_GR3411, 0, 0, hHash)
CryptHashData(hHash, data, Len(data), 0)

If CryptGetHashParam(hHash, HP_HASHSIZE, hashSize, dataLen, 0) <> 0 Then
	dataLen = hashSize
	Redim hash(dataLen - 1)
	If CryptGetHashParam(hHash, HP_HASHVAL, hash(0), dataLen, 0) = 0 Then
		Error 16, "Ошибка получения хеш-значения"
	End If
End If

Тут я получаю бинарный массив, который в виде строки будет выглядеть так:
801094720046147247182215244891032265199170250170109181132142247122342114105126245126

CAPICOM возвращает совсем другое значение:
Код:
hash = hashedData.Hash(data)

Результат:
86383C23AC83B80834388A14595B1532AFDA6BE2


И нужно ли вообще кодировать бинарный хэш, для формирования ЭЦП? Я попытался было, но что-то мне CryptBinaryToString всегда выдает ноль:
Код:
Declare Private Function CryptBinaryToStringA Lib "crypt32.dll" (Byval pbBinary As String, Byval cbBinary As Long, Byval dwFlags As Long, Byval pszString As String, pcchString As Long) As Long

Dim hexHash As String
Dim hexLength As Long

Call CryptBinaryToStringA(strHash, Len(strHash), CRYPT_STRING_HEX, "", hexLength)
Call CryptBinaryToStringA(strHash, Len(strHash), CRYPT_STRING_HEX, hexHash, hexLength)

Пробовал на вход бинарный массив давать - результат тот же:
hexLength = 0
hexHash = ""
GetLastError = 0


Offline Андрей Писарев  
#2 Оставлено : 23 августа 2012 г. 22:01:28(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
motogarri написал:
Они по разным алгоритмам вычисляются или CAPICOM как-то кодирует по своему?


Код:
CryptCreateHash(hProv, CALG_GR3411, 0, 0, hHash)
CryptHashData(hHash, data, Len(data), 0)

If CryptGetHashParam(hHash, HP_HASHSIZE, hashSize, dataLen, 0) <> 0 Then
	dataLen = hashSize
	Redim hash(dataLen - 1)
	If CryptGetHashParam(hHash, HP_HASHVAL, hash(0), dataLen, 0) = 0 Then
		Error 16, "Ошибка получения хеш-значения"
	End If
End If

Тут я получаю бинарный массив, который в виде строки будет выглядеть так:
801094720046147247182215244891032265199170250170109181132142247122342114105126245126

CAPICOM возвращает совсем другое значение:
Код:
hash = hashedData.Hash(data)

Результат:
86383C23AC83B80834388A14595B1532AFDA6BE2


И нужно ли вообще кодировать бинарный хэш, для формирования ЭЦП? Я попытался было, но что-то мне CryptBinaryToString всегда выдает ноль:
Код:
Declare Private Function CryptBinaryToStringA Lib "crypt32.dll" (Byval pbBinary As String, Byval cbBinary As Long, Byval dwFlags As Long, Byval pszString As String, pcchString As Long) As Long

Dim hexHash As String
Dim hexLength As Long

Call CryptBinaryToStringA(strHash, Len(strHash), CRYPT_STRING_HEX, "", hexLength)
Call CryptBinaryToStringA(strHash, Len(strHash), CRYPT_STRING_HEX, hexHash, hexLength)

Пробовал на вход бинарный массив давать - результат тот же:
hexLength = 0
hexHash = ""
GetLastError = 0






1. Где пример - как расчитывается хеш по ГОСТ в Capicom ?
2. Приведенный хеш полученный от Capicom - есть sha1, а не ГОСТ Р 34.11-94
3. В Capicom - зарезервированы идентификаторы алгоритмов хеширования (md5, sha1, sha256) - соответственно вопрос №1 "лишний" Anxious

Отредактировано пользователем 23 августа 2012 г. 22:03:01(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 23 августа 2012 г. 22:09:21(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
Тут я получаю бинарный массив, который в виде строки будет выглядеть так:
801094720046147247182215244891032265199170250170109181132142247122342114105126245126


84 в hex (?) => 42 байта = 336 бит ... а хеш 256-битный...
Техническую поддержку оказываем тут
Наша база знаний
Offline motogarri  
#4 Оставлено : 23 августа 2012 г. 22:11:20(UTC)
motogarri

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

Группы: Участники
Зарегистрирован: 03.08.2012(UTC)
Сообщений: 28

Да, вы правы по поводу алгоритма:
hashedData.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1

Но в СДК вычитал что:
Код:
   ' Определение алгоритма и размера ключа зашифрования.
   'EnvelopedData.Algorithm.Name = Algorithm - в CryptoPro CSP не поддерживается
   'EnvelopedData.Algorithm.KeyLength = KeyLength - - в CryptoPro CSP не поддерживается

и подумал, что будет вычисляться по госту.

Так не нужно хеш кодировать? Сразу шифровать?

п.с. Понял уже что перепутал с алгоритмами шифрования

Отредактировано пользователем 23 августа 2012 г. 22:16:46(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#5 Оставлено : 23 августа 2012 г. 22:17:24(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
motogarri написал:
Да, вы правы по поводу алгоритма:
hashedData.Algorithm = CAPICOM_HASH_ALGORITHM_SHA1

Но в СДК вычитал что:
Код:
   ' Определение алгоритма и размера ключа зашифрования.
   'EnvelopedData.Algorithm.Name = Algorithm - в CryptoPro CSP не поддерживается
   'EnvelopedData.Algorithm.KeyLength = KeyLength - - в CryptoPro CSP не поддерживается

и подумал, что будет вычисляться по госту.

Так не нужно хеш кодировать? Сразу шифровать?


1. зачем шифровать хеш?
2. зачем для этого использовать EnvelopedData из COM-обертки?


огласите конечную цель,
экстрасенсы еще в отпуске...
Техническую поддержку оказываем тут
Наша база знаний
Offline motogarri  
#6 Оставлено : 23 августа 2012 г. 22:22:45(UTC)
motogarri

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

Группы: Участники
Зарегистрирован: 03.08.2012(UTC)
Сообщений: 28

Конечная цель - ЭЦП
Просто не совпали хэши из capicom и cryptoapi и я подумал, что в cryptoapi, что-то не доделал или сделал не так.
Шифровать хэш, это я имел ввиду подписывать.

Offline Андрей Писарев  
#7 Оставлено : 23 августа 2012 г. 22:35:12(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
motogarri написал:
Конечная цель - ЭЦП
Просто не совпали хэши из capicom и cryptoapi и я подумал, что в cryptoapi, что-то не доделал или сделал не так.
Шифровать хэш, это я имел ввиду подписывать.



на выходе после шифрования (хеша\других данных) в Capicom - будет pkcs7 = зашифрованные данные,
которые никакого отношения не имеют к зашифрованному хешу с помощью закрытого ключа автора ( значению ЭЦП ) - т.е. смысл ЭЦП теряется (шифроваться же будет c использованием открытого ключа получателя, а не с закрытым ключом Автора ЭЦП (!))

Варианты по созданию ЭЦП:
использовать методы Capicom (Sign )
использовать функции из CryptoAPI ( CryptSignMessage или низкоуровневые функции (расчет хеша\подписание хеша CryptSignHash))

Отредактировано пользователем 23 августа 2012 г. 22:42:36(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline motogarri  
#8 Оставлено : 24 августа 2012 г. 2:17:11(UTC)
motogarri

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

Группы: Участники
Зарегистрирован: 03.08.2012(UTC)
Сообщений: 28

Я, походу, туплю и не так вопросы задаю))
Изначально хотел уточнить, какой из получившихся у меня хэшей правильный (сбило с толку, что они разные). Раз с помощью cryptoapi хэш вычисляется по ГОСТ алгоритму, значит именно так мне и нужно делать. И перед подписыванием не надо его никуда перекодировать.
Offline Андрей Писарев  
#9 Оставлено : 24 августа 2012 г. 3:52:00(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
motogarri написал:
Я, походу, туплю и не так вопросы задаю))
Изначально хотел уточнить, какой из получившихся у меня хэшей правильный (сбило с толку, что они разные). Раз с помощью cryptoapi хэш вычисляется по ГОСТ алгоритму, значит именно так мне и нужно делать. И перед подписыванием не надо его никуда перекодировать.



Еще раз....
ГОСТ Р 34.11-94
Размер хеша 256 бит

motogarri написал:

Тут я получаю бинарный массив, который в виде строки будет выглядеть так:
801094720046147247182215244891032265199170250170109181132142247122342114105126245126


84 байт в hex-строке => 42*8 бит <> 256 бит
Не сильно похоже на размер по обсуждаемого хеша...


Отредактировано пользователем 24 августа 2012 г. 4:06:58(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#10 Оставлено : 24 августа 2012 г. 4:02:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
CryptCreateHash(hProv, CALG_GR3411, 0, 0, hHash)
CryptHashData(hHash, data, Len(data), 0)



Советую также посмотреть последовательность вызовов в SDK

sdk\samples\CSP\SigningHash\SigningHash.c


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