Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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 |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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);
Возможно есть и другие способы, пишите.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Похоже, что параметр метода Hash класса hashedDataClass это не совсем строка, как это видится в interop, а массив байт составляющий строку. При необходимости использования в С# мы можем предоставить готовый интероп, где этот параметр как раз массив байт. Но хочу заметить, что в следующих версиях TSP SDK поддержка CPICom будет исключена. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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?
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.02.2012(UTC) Сообщений: 2 Откуда: Санкт-Петербург
|
Доброго времени суток! Вопрос возник в следующим приведённый здесь код действительно прекрасно работает но будет ли он правильно работать если мне необходимо получить Хэш с текста, который находится в кодировке UTF-8 или UTF-16. Если да то подскажите пожалуйста достаточно ли просто поменять кодировку при формировании массива байт.
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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. Если да то подскажите пожалуйста достаточно ли просто поменять кодировку при формировании массива байт. По-моему все верно, не проще ли попробовать?
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close