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

Уведомление

Icon
Error

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

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

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

Пытаюсь получить хэш по ГОСТ 34.11 с помощью библиотеки CPICom, входящей в состав TSP SDK.
Причем мне необходимо получить хэш через COM, а не CryptoAPI.

var hashedDataClass = new CPICom.HashedData20Class
{
Algorithm = (CAPICOM_HASH_ALGORITHM)CPICom.CPICOM_HASH_ALGORITHM.CAPICOM_HASH_ALGORITHM_GOST3411
};

hashedDataClass.Hash("abc");
var hash = hashedDataClass.Value;

В результате получаю следующий хэш: 2CB07926EBD3C4DC0092DA7301E169AD1323068849FC6A4423CF7C4CEAAB298A (судя по всему это уже hex string)

А правильный хэш должен быть такой: B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C (взято отсюда Wiki на ГОСТ 34.11)

В чем ошибка?

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

Offline Kirill Sobolev  
#2 Оставлено : 27 февраля 2012 г. 20:39:16(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Код:
hashedDataClass.Hash(Encoding.GetEncoding(1251).GetString("abc"));

Вот на это я получаю ошибку при компиляции
The best overloaded method match for 'System.Text.Encoding.GetString(byte[])' has some invalid arguments
Техническую поддержку оказываем тут
Наша база знаний
Offline ksvadim  
#3 Оставлено : 27 февраля 2012 г. 20:55:48(UTC)
ksvadim

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

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

в код вкралась ошибка, исправил.
Изначально пример был такой:

byte[] message = Encoding.GetEncoding(1251).GetBytes("abc");

Console.WriteLine("\nВычисление хэша с помощью CryptoApi:");
string cryptoApiHash = HashTest.GetHash(message);
Console.WriteLine(cryptoApiHash); // Выведет B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C

Console.WriteLine("\nВычисление хэша с помощью CPICom, входящей в состав TSP SDK и OCSP SDK:");
var hashedDataClass = new CPICom.HashedData20Class
{
Algorithm = (CAPICOM_HASH_ALGORITHM)CPICom.CPICOM_HASH_ALGORITHM.CAPICOM_HASH_ALGORITHM_GOST3411
};

hashedDataClass.Hash(Encoding.GetEncoding(1251).GetString(message));
var comHash = hashedDataClass.Value;
Console.WriteLine(comHash); // Выведет 2CB07926EBD3C4DC0092DA7301E169AD1323068849FC6A4423CF7C4CEAAB298A
Offline ksvadim  
#4 Оставлено : 28 февраля 2012 г. 14:02:44(UTC)
ksvadim

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

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

Сам отвечу на свой вопрос:
Похоже, что параметр метода Hash класса hashedDataClass это не совсем строка, как это видится в interop, а массив байт составляющий строку.
Передать массив байт под видом строки в .net можно через reflection:
object[] parameters = new Object[1];
parameters[0] = message;
hashedDataClass.GetType().InvokeMember("Hash", BindingFlags.InvokeMethod | BindingFlags.IgnoreCase, null, hashedDataClass, parameters);

Возможно есть и другие способы, пишите.
Offline Kirill Sobolev  
#5 Оставлено : 28 февраля 2012 г. 18:26:13(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Похоже, что параметр метода Hash класса hashedDataClass это не совсем строка, как это видится в interop, а массив байт составляющий строку.

При необходимости использования в С# мы можем предоставить готовый интероп, где этот параметр как раз массив байт.
Но хочу заметить, что в следующих версиях TSP SDK поддержка CPICom будет исключена.
Техническую поддержку оказываем тут
Наша база знаний
Offline Sigma-Soft  
#6 Оставлено : 1 марта 2012 г. 20:18:01(UTC)
Sigma-Soft

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

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

Я решаю ту же задачу, но на дельфи.

procedure GetStamp(const mes : TStringStream; out hash, Stamp : string);
var
oRequest, oUtils, oHash, oStamp: variant;
begin
if not Assigned(mes) then exit;
//Создание экземпляров объектов
oRequest := CreateOleObject('TSPCOM.TSPRequest');
oUtils := CreateOleObject('CAPICOM.Utilities');
oHash := CreateOleObject('CPICOM.HashedData.2.0');

//Хеширование данных
oHash.Algorithm := 4;
oHash.Hash(AnsiString(Mes.DataString));
oRequest.Hash:=IDispatch(oHash);

oStamp := oRequest.Send;
Stamp := oUtils.Base64Encode(oStamp.Export);
hash := oRequest.HashValue;
oRequest.Display(0,'');
end;

Не получить хеш по ГОСТ Р 34.11-94 (CryptoPro) в штампе.
Помогите, пожалуйста!
1. Что нужно задать вместо 4 в oHash.Algorithm?
2. Где найти документацию по CPICOM?
Offline Maxim.Rubchenko  
#7 Оставлено : 2 марта 2012 г. 14:36:06(UTC)
Maxim.Rubchenko

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

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

Доброго времени суток!
Вопрос возник в следующим приведённый здесь код действительно прекрасно работает но будет ли он правильно работать если мне необходимо получить Хэш с текста, который находится в кодировке UTF-8 или UTF-16. Если да то подскажите пожалуйста достаточно ли просто поменять кодировку при формировании массива байт.
Offline ksvadim  
#8 Оставлено : 2 марта 2012 г. 17:14:00(UTC)
ksvadim

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

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

To Sigma-Soft:
Цитата:
1. Что нужно задать вместо 4 в oHash.Algorithm?

CAPICOM_HASH_ALGORITHM_GOST3411 = 256
Цитата:
2. Где найти документацию по CPICOM?

CPICom входит в состав TSP SDK, судя по всему там.
Также напишу сюда примечание от Kirill Sobolev: "... в следующих версиях TSP SDK поддержка CPICom будет исключена, , хэш для штампов времени будет считаться внутри TSPRequest".

To Maxim.Rubchenko:
Цитата:
Вопрос возник в следующим приведённый здесь код действительно прекрасно работает но будет ли он правильно работать если мне необходимо получить Хэш с текста, который находится в кодировке UTF-8 или UTF-16. Если да то подскажите пожалуйста достаточно ли просто поменять кодировку при формировании массива байт.

По-моему все верно, не проще ли попробовать?
Offline Maxim.Rubchenko  
#9 Оставлено : 2 марта 2012 г. 17:45:15(UTC)
Maxim.Rubchenko

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

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

To ksvadim:
Уже попробовал. Результат странный:
1)при ввыборе кодировки 1251
GOST("abc")=B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C
GOST("абв")=F63ADD944B771E4DE7BFA5EDA8BDFC6E4DE119158C4B3C80CA1840E90C61F861
2)при ввыборе кодировки UTF-8
GOST("abc")=B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C
GOST("абв")=CCE865A142DADF9F6C2F9B03833EADEA8AA37BD0FC3929C00138FB1CB1636839

Т.е. мы получаем при использовании латинского алфавита всё хорошо, с русским сложнее, что является правильным в данном случае?

PS: GOST я применил для сокращение условно это функция которая вычисляет хеш на основе приведённого выше исходного кода.

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

Offline Андрей Писарев  
#10 Оставлено : 2 марта 2012 г. 17:56:23(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Maxim.Rubchenko написал:
To ksvadim:
Уже попробовал. Результат странный:
1)при ввыборе кодировки 1251
GOST("abc")=B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C
GOST("абв")=F63ADD944B771E4DE7BFA5EDA8BDFC6E4DE119158C4B3C80CA1840E90C61F861
2)при ввыборе кодировки UTF-8
GOST("abc")=B285056DBF18D7392D7677369524DD14747459ED8143997E163B2986F92FD42C
GOST("абв")=CCE865A142DADF9F6C2F9B03833EADEA8AA37BD0FC3929C00138FB1CB1636839

Т.е. мы получаем при использовании латинского алфавита всё хорошо, с русским сложнее, что является правильным в данном случае?

PS: GOST я применил для сокращение условно это функция которая вычисляет хеш на основе приведённого выше исходного кода.



хеш от абв по ГОСТ Р 34.11-94:
GOST("абв") ANSI =F63ADD944B771E4DE7BFA5EDA8BDFC6E4DE119158C4B3C80CA1840E90C61F861

как "массив байт"

Отредактировано пользователем 2 марта 2012 г. 18:07:05(UTC)  | Причина: Не указана

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