Фрагмент документа "О ВНЕСЕНИИ ИЗМЕНЕНИЙ И ДОПОЛНЕНИЙ В ПРИКАЗ ФОМС ОТ 30.12.2004 N 91 "ОБ ОРГАНИЗАЦИИ ИНФОРМАЦИОННОГО ВЗАИМОДЕЙСТВИЯ ПО ОБЕСПЕЧЕНИЮ НЕОБХОДИМЫМИ ЛЕКАРСТВЕННЫМИ СРЕДСТВАМИ ОТДЕЛЬНЫХ КАТЕГОРИЙ ГРАЖДАН" (В РЕДАКЦИИ ПРИКАЗОВ ФОМС ОТ 24.05.2005 N 51, ОТ 02.08".
Алгоритм SHA (Secure Hash Algorithm) стандарта безопасного хеширования (Secure Hash Standard, SHS). В зависимости от выходного хеш-значения выделяют следующие виды SHA: SHA1 - выходное значение 160 бит; SHA256 - выходное значение 256 бит; SHA512 - выходное значение 512 бит; SHA384 - выходное значение 384 бита. Стандарт ИСО - ISO/IEC 10118-3:2004 (http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail? CSNUMBER=39876). Настоящий документ описывает стандарт SHA1. Описание реализации алгоритма SHA1 на языке C++: typedef int HASH[5]; typedef int T512[16]; typedef int T80[80]; typedef int (*LPFNHASH)(int, int, int);// Функции F1, F2, F3 const int K1 = 0x5a827999; const int K2 = 0x6ed9eba1; const int К3 = 0x8f1bbcdc; const int K4 = 0xca62c1d6; unsigned ROL(unsigned a, size_t s) { return a << s | (a >> (sizeof (T)*8 - s)); } int f1(int x, int y, int z) { return x&y | (~x)&z; } /\ / int f2(int x, int y, int z) { return х у z; } int f3(int x, int y, int z) { return x&y | x&z | y&z; } void FillT80(T512 M, T80 W) { size_t t; for(t = 0; t < 16; t++)W[t] = M[t]; /\ /\ / for(; t < 80; t++)W[t] = ROL(W[t-3] W[t-8] W[t-14] W[t-16], 1); } void MainStep(T80 W, size_t t, HASH H, LPFNHASH f, int K) { int tmp = ROL(H[0], 5) + f(H[1], H[2], H[3]) + H[4] + W[t] + K; H[4] = H[3]; H[3] = H[2]; H[2] = ROL(H[1], 30); H[1] = H[0]; H[0] = tmp; } void StepSHA(T512 M, HASH Hr) { T80 W; FillT80(M, W); size_t t; HASH H; memcpy(H, Hr, sizeof(HASH)); for(t = 0; t < 20; t++) MainStep(W, t, H, f1, K1); for(; t < 40; t++) MainStep(W, t, H, f2, K2); for(; t < 60; t++) MainStep(W, t, H, f3, К3); for(; t < 80; t++) MainStep(W, t, H, f2, K4); for(size_t i = 0; i < 5; i++) Hr[i] += H[i]; } Функции F1, F2, F3: F1(X,Y,Z) = (X /\ Y) \/ ((-|X) /\ Z) F2(X,Y,Z) = X (+) Y (+) Z F3(X,Y,Z) = (X /\ Y) \/ (X /\ Z) \/ (Y /\ Z) ROL(X,Y) - циклический сдвиг Х влево на Y разрядов, где: /\ - логическое "И"; \/ - логическое "Или"; -+ - логическое "Не"; (+) - логическое "Исключающее или". Перед запуском алгоритма хеш-значение должно инициализироваться следующими константами: const HASH HASHFIRST = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; Замечание: тип int хранит байты в обратном порядке. В приведенном примере минимальной единицей памяти является 32-битный блок, поэтому способ хранения на диске неважен. При побайтовой обработке это следует учитывать. Приложение N 3.5 к Методическим рекомендациям по организации информационного взаимодействия между участниками лекарственного обеспечения отдельных категорий граждан при обязательном медицинского страхования (с изменениями и дополнениями) от 21 марта 2006 года СПЕЦИФИКАЦИЯ ПРОТОКОЛА ЭКСПОРТА-ИМПОРТА РЕЕСТРОВ ОСТАТКОВ ЛЕКАРСТВЕННЫХ СРЕДСТВ ПЕРЕЧЕНЬ СОКРАЩЕНИЙ И УСЛОВНЫХ ОБОЗНАЧЕНИЙ ТФОМС Территориальный фонд обязательного медицинского страхования ЦОД Центр обработки данных |
Фрагмент документа "О ВНЕСЕНИИ ИЗМЕНЕНИЙ И ДОПОЛНЕНИЙ В ПРИКАЗ ФОМС ОТ 30.12.2004 N 91 "ОБ ОРГАНИЗАЦИИ ИНФОРМАЦИОННОГО ВЗАИМОДЕЙСТВИЯ ПО ОБЕСПЕЧЕНИЮ НЕОБХОДИМЫМИ ЛЕКАРСТВЕННЫМИ СРЕДСТВАМИ ОТДЕЛЬНЫХ КАТЕГОРИЙ ГРАЖДАН" (В РЕДАКЦИИ ПРИКАЗОВ ФОМС ОТ 24.05.2005 N 51, ОТ 02.08".