Макрос рассчета HASH файлов по ГОСТ Р 34.11 - 94

Автор:SKucherov
Дата:15.06.2012
Просмотров:7288
Скачиваний:2371
Оценка: - , Оценок - 0
Сохранить в файле

Обсудить в форуме

Описание

Для организации хранилища ДЭВ и других задач требуется расчет ХЭШ функции файлов по ГОСТ Р 34.11 - 94.
У Криптоком есть для этого готовая утилита, для работы из командной строки - CALCHASH.exe

При запуске получаем следующую информацию об утилите:

C:\openssl\bin>calchash.exe
Программа контроля целостности файлов calchash в.4.3.0.0
Вычисление хэш-вектора производится по ГОСТ Р 34.11 - 94.
Стартовый вектор хэширования и заполнение узлов замены
взяты из контрольного примера, приведенного в приложении
к тексту ГОСТ Р 34.11 - 94.

ПАРАМЕТРЫ ВЫЗОВА:
1. <имя файла, для которого нужно вычислить хэш-вектор>.


(C) DimKa Software Ltd. 1996. (С) OOO "Криптоком" 2008

FreeWare.


т.е требованиям ГОСТ а соответственно указанию Указанию ЦБР № 2346-У удовлетворяет.
осталось написать макрофункцию, которую можно было бы использовать в других прикладных макросах, в виде:
hash = hash_file(namefile);

Входной параметр строка - путь к файлу, на выходе строка - значение ХЭШ функции.




Для информации:

Файл CALCHASH.EXE входит в состав разных приложений КРИПТОКОМ. Если банк использует клиент-банк с криптозащитой от КРИПТОКОМ, то можно его найти в составе крипто-утилит развернутых на сервере. Если не найдете, то рекомендую скачать с сайта Криптокома Ознакомительная версия «МагПро OpenVPN-ГОСТ» http://www.cryptocom.ru/opensource/pkgs/windows/client.zip
Развернуть из архива инсталяшку Cryptopack.exe и оттуда забрать CALCHASH.EXE.

Результаты контрольного примера рассчета ХЭШ из ГОСТ Р 34.11 - 94.
GOST("This is message, length=32 bytes") =
B1C466D3 7519B82E 8319819F F32595E0 47A28CB6 F83EFF1C 6916A815 A637FFFA

Текст примера

 /*                                      
  Кучеров С. макрос вычисления хэш файла    через внешнюю утилиту...  
         !!!   calchash.exe  - положить в папку OBJ  !!!                    
*/
import bankinter,rsexts;


private macro hash_pravo_levo(zz);

 var ss="",l,b;
 zz=strsubst(zz," ","");
 if (strlen(zz)!=64)
  return "FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF";
 end;
 l=63;b=0;
 while (l>0)
  ss=ss+substr(zz,l,2);
  b=b+1;
  if (b==4) ss=ss+" "; b=0; end;
  l=l-2;
 end; //while
 return trim(ss);
end; //macro


macro  hash_file(namefile)
var fo=GetWorkFileName("hash"),zz="";
file aa () txt;
if (run ("calchash",strfor(34)+namefile+strfor(34), ">"+fo) == 0)
 open(aa,fo);
 while (next(aa))
 zz=aa.str;
 end;
 close(aa); 
 removefile(fo);
end;
return hash_pravo_levo(zz);
end; //macro


//test
//msgbox(hash_file("\\\\srvrsbank\\txtfile\\test1.txt"));