Недействующий

О внесении изменений и дополнений в приказ ФОМС от 30.12.2004 N 91 "Об организации информационного взаимодействия по обеспечению необходимыми лекарственными средствами отдельных категорий граждан" ... (отменен)

8. Алгоритм расчета контрольной суммы


Для расчета контрольной суммы по XML-файлу выделяется строка символов, между правой угловой скобкой открывающего тега <MAIN> (не включая ее) и заканчивающаяся и левой угловой скобкой закрывающего тега </MAIN> (не включая ее).

Символы пробелов, табуляции, возврата каретки и перевода строки не сохраняются в полученной строке и не участвуют в расчете контрольной суммы.

Далее по этой строке ведется подсчет контрольной суммы в соответствии с алгоритмом, указанном в пункте 8.1 настоящего документа.

Полученное значение заносится в атрибут chsm.

8.1. Алгоритм расчета контрольной суммы по строке символов

В расчете контрольной суммы по выделенной строке применяется алгоритм Secure Hash Algorithm (SHA) стандарта Secure Hash Standard (SHS).

Алгоритм 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 = 0x6ed9ebal;

const int К3 = 0x8fIbbcdc;

const int K4 = 0xca62cld6;

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 х^у^г; }

int f3 (int x, int y, int z) { return x&y I 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) - циклический сдвиг X влево на Y разрядов;

где

- логическое "И";

- логическое "Или";

- логическое "Не";