Значення Y' виходу циклової функції для другої матриці Z' буде таким:
2А 98 7Е А4 0F 91 70 61
F5 D6 F0 АО Е4 64 4F 48
8А 7А 5А 52 DE ЕЕ 65 62
07 С5 62 F9 88 Е9 5С 69
16 BD C8 03 IB C5 BE IB
7B 94 76 39 FE 05 OB 56
93 9B AA AO AD FF 9A E6
74 5B 7B 18 IC ЗВ E3 FD
Геш-кодом для цього рядка буде такий 512-бітний рядок:
2А987ЕА40F917061 F5D6F0A0E4644F48 8А7А5А52DEEE6562 07С562F988Е95С69 16BDC80З1ВС5ВЕ1В 7В947639FE050В56 939BAAA0ADFF9AE6 745В7В181СЗВЕЗFD
А.7.9 Приклад 9
У цьому прикладі рядок даних — це 1000000-байтний рядок, утворений з ASCII-кодів символів рядка, що містить 106 символів ‘а1.
Геш-кодом для цього рядка буде такий 512-бітний рядок:
0C99005BEB57EFF5 0A7CF005560DDF5D 29057FD86В20BFD6 2DECA0F1CCEA4AF5 1FC15490EDDC47AF 32ВВ2В66С34FF9AD 8С6008AD677F7712 695ЗВ226E4ED8B01
ДОДАТОК В
(довідковий)
ФОРМАЛЬНІ СПЕЦИФІКАЦІЇ
В.О Вступ
У наступних розділах наведено повні специфікації спеціалізованих геш-функцій 1, 2 та 3 на мові специфікацій Z. Нотація Z описана в [1].
Z-специфікація зберігає більшість імен, структур тощо, використовуваних в основній частині цього стандарту.
Z-специфікація написана винятково на мові Z, охоплюючи коментарі. У коментарях зазначено розділи основного тексту цього стандарту, з яких виведено Z-специфікацію.
Z-специфікація моделює повідомлення як послідовність натуральних чисел 0 та 1 (рядок).
Специфікація спеціалізованої геш-функції 1
#3 Терміни та визначення понять
Циклова функція
Bit== (0,1}
Sfring =— szqBit
Д: N
Z2: Мт
String—Lі == (s. String J =
= {5: Siring I # j
І Ф: String_Li x String_Lz —* String^Слово
Word == {ж String I # vf = 32}
Wordjcapocity == 2 T 32
Word_capacity_m_l = = (2 T 32) - 1
fWord Q.. Word_copacity_m_l
#4 Познаки та скорочення
Sn () Необхідно тільки визначити S як Sn (ітерація відношення), що визначено в Z.
S: Word -> Word
VA:Word*
(letI = W_to_I(A)*
(let shift _ / = (/ * 2 + (2div (2 T 31))) mo d (2 T 32) •
S(A) = I _to_ W(shift _ /))) av® Визначені тільки для слів, бо це єдина вимога.
BO = Bit х Bit Bit
LO: Word x Word x BO —> Word
V p,q:Wordfto: BO*
LO(pfq,bo) ='{и: 1 p*nt-t bo(p(n), #(ra))}
x
and :BO
or_, _ or0 xor 1 = 1
0 xor 0 = 0
xor 0 = 1
xor 1 = 0
0 or 1 = 1
0 or 0 = 0
lor0 = l
I or 1 = 1
0 and 1 = 0
0 and 0 = 0 landO = 0
1 <mdl = l
_XOR _,_OR_,_ AND_ :flW x Word -> Word
Va^B : Word •
XXORB = LO(A> Bf (_xor_)) л
Я OR В = LO{A,B, (_or J) л
J AND В ® LO(AtB, (_and_))
NOT W W -> Word
V A : Word •
NOT A = JXORfr :1 .. #A • и )-> 1}
S _ Word x Word —> Word
V A, В : Word •
A 83 B- I_fo_W((Wmod Word^capacity)
#5 Вимоги до об'єкта стандартизації
#6 Модель спеціалізованих геш-функцій
By te *=» {£: String I # b = 8}
Zffyw == 0 .. 255
B_to_/: Вую —> IByte
Vx Byte • B_ro_Z(x) ж
x(l) *217+ .v(2) • 2 ? 6 + л<3) * 2 T 5 + x(4) » 2 T 4 +
45) • 2 f З T j(6) » 2 t 2 + xf7)’ 2 + x(8)
Процес гешування
I IV : String _ L2
I Maxinnan_Length_ofjString : N
hash : String ■+* String_L^
V D : String ? # D < MaximumJbengthjofJString • hash(D) =
(letPD == po<?(D) •
(letSD == sph't(PD) •
(let/7g — iterate(SDfIV) • ггипса№(Н^)У))
Крок 1 (заповнювання)
StrmgMultiple_Lx == (s : String | #s modi] - 0}
I pad: String —> StringMultiple^
Крок 2 (розщеплювання)
StringBlocks -= seq String_L
split : StringMultipl&J^ —> StringBlocks
split — {sml '.StringMultipleJ^ sb : StringBlocks | snill - У sb • smll I—> $d}
Крок 3 (ітерація)
iterate: StringBlocks x String^I^ -** S^rmg_Z2
V sb : StringBlocks; НіЛ: StringJLq | # sb > 1 • iterate(sb, —
(let Di = j5(1) •
(let Ні = Ф(Р^ЯМ).
if = 1
then Я и
else iterate(tail sb, #,)))
Крок 4 (відтинання)
=- {s : String I fts — L#}
truncate :String_L-2 —> StringjL^
V sr : _L2•
truncatefsy) = (1 ...Zg) 1 sy
7 Спеціалізована геш-функція 1
Maxjmi(in_Lergth_of_String ~ (2 T 64) - 1
7.1 Параметри, функції та константи
7.1.1 Параметри
= 512
L2= 160
Lh = 160
7.1.2 Узгодження порядку слідування байтів
WjaJ- Word ~ |
+ IWprd |
Vw Word • |
|
|
|
(let Sq |
= X-toJW 8) 1w)* |
(Jet Д |
— BjoJW ... 16) Iw) « |
(ktB. |
— 5_«_Z(a7 24) Iw) » |
(let^ |
*= J_ft7_/((25 ... 32) tw) • |
|
* 2 T 24+5г*2Т16+^ж2Т8 + Яо)))) |
Ijoj?: IWard -> Word#7.1 Л Функції
-= {f : seq (ftcW x FFbrr/ x Word -* Word} і #g - SO}
g : Jndaxedjg
(Vj: 1 . 16 *
g(f)(A0, A) = Xo XORXj XORASJa
(Vf : 17 ... 32 •
g(>Xr0»AYAy - (Xo ANDX^ORCNOTAq AND A,)) a
(Vf : 33 ... 48 •
g(})(X&XitX2) ~ (Xq OR NOT ATJ) XORA’_2)a
(Vf . 49 ... 64 •
g(iXX9,XvX2) =(Хй ANDA*2) OR(Xj ANDNOTA'2))a
(V f : 65 ... 80 •
g(fKX9fXvX2} = X^ XOR(Xj OR NOT A'.))
#7.1.4 Константи
xOOOOOOOO == 0
X5A827999 == 1518500249
X6ED9EBA1 == 1859775393
X8F1BBCDC == 2400959708
XA953FD4E =« 2840853838
X50A28BE6 == 1352829926
X5C4DD124 == 1548603684
X6D703EF3 == 1836072691
X7A6D76E9 == 2053994217
Constants =- {c : StringWord | # c = 80}
С, С': Constants
(Vi : 1 .. |
, 16 • |
ОД |
= /_^_ЇГ(хОООООООО))л |
(V ї : 17 |
... 32 • |
C(z) |
= 2л?_Г(х5Л827999))л |
(V r : 33 |
...48 • |
C(0 |
= IJoJ?(x6E£0EBAl))* |
(V і : 49 |
... 64 • |
C(z) |
= L/oJF(xSFlBBCDC))/ |
(V/ : 65 |
... 80 • |
c(o |
« /_^_1Г(хЛ953ГП4Е))л |
(Vi ; 1 .. |
. 16 • |
c'(0 |
= Оо_Иг(х50Л28Я£6))л |
(V/ : 17 |
... 32 • |
C'(7) |
= /*>_JF(x5C4ZU)124))a |
(V і : 33 |
... 48 • |
C’(0 |
= 7_ґо_ії7(х6П703ГГЗ))а |
(V? : 49 |
... 64 • |
C'(0 |
= Uo^(x7A6D76E9))a |
(V і : 65 |
... 80 • |
Cf(0 |
= 7_ro_lF(x00000000)) |
(11.14,15.12,5,8,7.9,11.13.14.15.6.7,9.8, 7,6.8.13.11.9,7.15.7.12.15.9.11.7.13.12, 11.13.6.7.14.9.13.15.14.8,13.6.5.12.7.5.
11.12.14,15.14,15.9,8,9.14.5.6.8,6.5.12.
9,15.5,11,6.8,13.12,5.12.13,14.11, S, 5.6)
(8,9.9,11.13,15,15,5.7.7.8,11.14,14.12.6, 9.13,15.7.12,8,9,11.7,7,12.7.6.15.13.11.
9.7.15.11.8,6.6.14,12.13.5.14.13.13.7.5,
15.5,8.11,14,14,6,14,6,9.12,9.12.5.15.8,
8,5.12.9.12.5,14.6.8.13,6.5,15.13,11,11)Записані значення для а та а' на одиницю більші ніж в основному тексті, бо послідовності Z починаються з 1.
(1.2.3.4.5. б. 7.8.9.10.11.12.1114.15.16,
8,5.14.2,11.7.16,4,13.1,10,6.3,15.12.9, 4,11,15.5.10,16,9. 2,3,8,1,7,14,12,6.13.
2,10.12.11.1.9.13.5,14,4,8.16.15. 6, 7,3.
5.1.610. 8.13.3.11.16 2.4.9.12.7.1614}
(615.8.1.10. 3.12.5.14. 7.169.2.11.4.13.
7.12.4.8.1.14.6.11.15.169.13,5.10.2.3.
16 6 2.4,8.15.7,10,12.9,13,3,11.1,5.14.
9,7,5,2,4.12,161.613,3,14,10.8.11.15.
13,16.11,5,2.6, 9.S, 7,3,14,15,1.4,10,12}
#7.1.5 Початкове значення
*67452301 1732584193
= 2_/о_Н’(*67452301) xEFCDABS9 = 4023233417 lj = IjeJFfx^CDABW) x98BADCFE = 2562383102 Г2 = I~roJV(x9SBADCFE) *10325476 = 271733878 Г3 = />_F(xl0325476) *C3£2£1FO = 3285377520 K4 == 7^о_Г(лС37)2£1Г0)
iv ~ VJi’r/ iyr4
#7.2 Метод заповнювання
V D : String • pad(D) = (ieap = #d • (ktZeros == {и 1 ... «447-Zp)mod512) • и i-4 0} • (ktLength_D_LSH = Mo_fT(LD mod (2 T 32)) • QetLength_D_MSH = I_JoJF(L0 div (2 T 32)) •
D ~ (1) " Zeros ~ Length_D_LSH ~ I^ngth_D_MSH)y)
)(((((((«м_£л.г.сіл..ол
(f).x я (гіг в (і)л = w 4»i)
(г)<У в (Il¥ a (5).I=U4»I)
(і).x я (sir и (ш = г.г4ч)
(s),x в (>).v в (£)I=1.1 »»i)
frlr в (£ir s (г).{=ox 4»i)
• (I ',Э ‘,о ',І 'В&л 'Л 2)087=«X4»l)
♦ (I 'Э '» '4 ® ‘Л 2)087=Л’1*1)
* == X p[)
• ™ Z idl)
» (ду “хОф
« : A J: : ЛТ д
(«(I + ГО 'V 'І '3 7 lZ)0S7 «Iе
J «*4»
(08=0 JI
♦ <€X4ZX)otS LY 41 >X) = .I
* В (to В (0*)z ffi (ЕГ 'or 'Шда S OX) w,$ = лі *41)
• <£)X •* t-X Xfr)x «• EX -(£)x г X Xe)x IX -(I) X OX **[)
=40'^ ’^77)087
•S = X?V9I = z#108- 1^jitcisiw3 3
has: о 7 tZ~рвхври/1S .рло^Зищ^ ^x'Z К
рлО^ЗіШ^ <— 08 ‘ [ X
x toy x toy x STp&x&puf
{.$££ ні* .ні* / — у I pjo^Suujg: iHJ :8иьц$ : y}
- oj 8uixj$
рло^Зит^ <- : рло^8иьц$ oi 2шм$ jyd$
bes ==
,і|їіянЛф іраоияиО эиио C*2#В.1.1 Допоміжні функції
Vp: N •
0=1 л
(Vw: -1)))
B.2 Специфікація спеціалізованої геш-функції 2
Секції #3, #4, #5, #6 та В.1.1 додатка В.1 треба повторити для цієї частини додатка.
8 Спеціалізована геш-функція 2
Maximum Length_ofJString = (2 ? 64) -1
8.1 Параметри, функції та константи
8.1.1 Параметри
Ц = 512
L2 = 128
128
8.1.2 Узгодження порядку слідування байтів
Секцію #7.1.2 додатка В.1 тут треба повторити
8.1.3 Функції
Секцію #7,1.3 додатка В.1 тут треба повторити g 2==(1 ...64) 1 д
8.1.4 Константи
хОООООООО == о
Х5А827999 == 1518500249
X6ED9EBA1 == 1859775393
xBFlBBCDC == 2400959708
х50А28ВЕб == 1352829926
X5C4DD124 == 1548603684
X6D703EF3 == 1836072691
Constants == (г : StringWord | # с ~ 64}
Секцію #7.1.4 додатка В.1 тут треба повторити тільки для і, Г, а, а',
Ї2==(1...64) 1 t
12’==(1...64) 1 Г
а2 == (1...64) 1 а
а2' = (1...64)1а'
#8.1.5 Початкове значення
*67452301 -= 1732584193 70 == 7>_йфсб7452301) xEFCDAB$9 == 4023233417 Г1== IjoJ?(xEFCDABS9) x98BADCFE == 2562383102 72== IjoJF(x9ZBADCFE) *10325476 == 271733878 У5 ==/_?□ JF(*10325476)
#8.2 Метод заповнювання
Секцію #7.2 додатка В. 1 тут треба повторити.
#8.3 Опис циклової функції
Секцію #7.3 додатка В.1 тут треба повторити для означень StringWord та Split_String_to_StringWord.
L64:StringWdrd х StringWord х
Indexed_g х seq N х seq N х
Constants х 1 „64 -> StringWord
V Z,X. StringWord; g: Indexed_g; t, a: seq N;
C:Consmfc;i:1..64|#Z==16A#X=5*
L64(ZtXfg,ttatC,i) =
(let X0 = X(l); XI == X(2); X2 = X(3); X3=X(4) •
(letlF==Sr<o(X0 S sOXYl, JG, X3) ffl Z(a(f)) ffl C(0)
(letr==(X3, J7,X1.X2)« if (;=64) then Y
elwL&KZ, Il £ t, a, C, і +1))))
V sx: String_Li; лт: StringJL^ • &(sx,sy')~
(let Z — Split_String_toJStiingWard (sx) • Get Y = Split_Sfring_to_StringWbrd(sy)^ (etX = L64(Z Y, revgl, t2 a2 C, !)• (letX — £64(Zf £ revS2, ґ2', a2 C !)• Get Г0 = Г(2) Ш X(3) E X'(4) •
Get П = 7(3) В X(4) ffl X'(l) *
Get 72 = 7(4) ffl X( 1) ffl X’(2) •
Get 73 = 7(1) ffl X(2) В X'(3) •
70'71" 72 "73))))))))
В.З Специфікація Спеціалізованої геш-функції З
Секції #3, #4, #5, #6 та В.1.1 додатка В.1 треба повторити для цієї частини додатка.
9 Спеціалізована геш-функція З
MaximumJLen^th_of_String - (2 Т 64) -1
9.1 Параметри, функції та константи
9.1.1 Параметри
Ц = 512
Lz = 128
£„=128
9.1.2 Узгодження порядку слідування байтів
W_to_I:Ward->lWord
V w: ІГогй • lF_to_/(w) ~
(let Bq — 5_Л?_7((1... 8) I w) •
(let . 16) 5 tv) •
(let = j3_/c?_Z((I7.,. 24) 1 w*) •
(let Л3 = 1 n)<
Bi + 53 *2*8 + Я,*2*16+5с*2*24))))
'.IWord -+ JFdrrf
#9.1.3 Функції
IndexedJ = {/ :■?<?<? (Word x Word x Word -+ PRW) | # / »80}
/ .IndexedJ _________________
Л0(А'а, Xi, A”,)=(Xo AND Xj) OR (NOT A'o AND X2)) A (Vj:21...4O*
/GXA’o, Хз, A ) = Xq XOR Xj XOR X2) Л
(W:41 ...60e
/(/)(XG, Xj, X2) = (A% AND X]) OR (X5 AND X,) OR (Xj AND X2)) л (Vt:61...80«
/(f)(X0 ДьX) = Xo XORX3 XORX2)#9.1.4 Константи
0.4827999 = 1518500249
x6ED9EBAl = 1859775393 x8FlBBCDC = 2400959708 аСЛ62С1£>6 == 3395469782
Constants -- (c : SfringPTord ]#c - 80}
C: Cans tan &
(Vrl...2O*
COO=7^_IT(r5 J827999)) л
(Vi:21...4O*
C(0 = IjoJT(x6ED9EBA)) л
(УЛ41...60*
C(f) -2^ГГ(д8ЛЛЛС£>С))л
(Vf:61...8O*
ОД = 2_^n’(xCJ62Cl£)6))
#9.1.5 Початкове значення
Х67452Э01 •« 1732584193
П == Оо_ГЦл-€74523С1)
xEFCDABW == 4023233417
її ==/ to KxEFCDABZ9)
xVSBADCFE == 2562383102
Is == l_to_H^9^BADCFE)
*10325476 271733878
Із == 7_го_Г?'(х10325476)
xC3Z)2£lF0 == 3285377520
K4 ==7_/o_HVC3Z)2£1M))
iv=vvvvr4
#9.2 Метод заповнювання
V D: •
pad(D) =
(let Zeros = {m : 1.. .((447 - L&) mod 512) • и 0} •
(let Lwgth_DJ£SH == I_toJF(LD div (2 T 32» •