ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ОписаниС стандарта ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ Российской Π€Π΅Π΄Π΅Ρ€Π°Ρ†ΠΈΠΈ содСрТится Π² ΠΎΡ‡Π΅Π½ΡŒ интСрСсном Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅, ΠΎΠ·Π°Π³Π»Π°Π²Π»Π΅Π½Π½ΠΎΠΌ «ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌ криптографичСского прСобразования Π“ΠžΠ‘Π’ 28 147−89». Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠΈ вмСсто Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° «ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅» Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ понятиС «ΠΊΡ€ΠΈΠΏΡ‚ографичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ «, вовсС Π½Π΅ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎ. Помимо Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тСсно связанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ описан ΠΎΠ΄ΠΈΠ½… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π—Π°Π΄Π°Π½ΠΈΠ΅ 1. ΠœΠ΅Ρ‚ΠΎΠ΄ Π·ΠΎΠ½Π½ΠΎΠ³ΠΎ сТатия ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

ΠŸΡ€ΠΈ записи ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ Π­Π’Πœ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Π΅ ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€Π΅ отводится ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 8 Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… разрядов (Π±Π°ΠΉΡ‚), ΠΈΠ±ΠΎ послСдний являСтся наимСньшСй адрСсуСмой структурной Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ памяти.

ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ сТатия Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΡƒΠΆΠ΅ исходя ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ 8 Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… разрядов, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π±Π°ΠΉΡ‚, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚ ΠΈΠ· 256 Π±ΡƒΠΊΠ², Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρ‹, вмСстС с Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‚ 50−60 Π·Π½Π°ΠΊΠΎΠ². Однако ΠΈ 50−60 Π·Π½Π°ΠΊΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΈΠ»ΠΈ 5−6-Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ структуру ячСйки. Вакая структура Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ 2−3-Ρ… Π±ΠΈΡ‚Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ лишь 4−8 Π±ΡƒΠΊΠ² (Π½Π΅ Π³ΠΎΠ²ΠΎΡ€Ρ ΡƒΠΆΠ΅ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ считывания).

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π… Π±Π°ΠΉΡ‚Π° для прСдставлСния Π±ΡƒΠΊΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ абстрактного Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΡΡ‚ΠΎΠΌ 16-Ρ‚ΠΈ-Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠΌ (m=16) Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ ΠΏΠΎ n=2 Π±ΡƒΠΊΠ²Ρ‹ Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌ словС. Π’ΠΎΠ³Π΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².

ΠšΠΎΠ΄ΠΎΠ²Ρ‹Π΅ слова Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 4 разряда всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π·ΠΎΠ½Ρƒ, Π° Π²Ρ‚ΠΎΡ€Ρ‹Π΅ 4 — Ρ†ΠΈΡ„Ρ€Ρ‹. Число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° Π² ΡΡ‚ΠΎΠΌ случаС ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ N=313=39 (4 Π·ΠΎΠ½Ρ‹ Π΄Π°Π»ΠΈ Π±Ρ‹ 124=48; ΠΏΡΡ‚ΡŒ — 115=55 ΠΈ Ρ‚. Π΄.), Π½ΠΎ Π·Π°Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π°Π»Ρ„Π°Π²ΠΈΡ‚ Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ построСния 4-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ структуры памяти ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·ΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ сТатия ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

ИдСя Π·ΠΎΠ½Π½ΠΎΠ³ΠΎ сТатия базируСтся Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠΊΠ²Ρ‹ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π·ΠΎΠ½Π°ΠΌ, ΠΈ Π΅ΡΠ»ΠΈ Π² Ρ‚СкстС рядом Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π±ΡƒΠΊΠ²Ρ‹, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Π·ΠΎΠ½Π΅, Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€ Π΅Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ, Π° Π·Π°ΠΏΠΈΡΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π±ΡƒΠΊΠ² ограничиваСтся записью ΠΈΡ… Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ части.

Если ΠΊΡ€ΠΎΠΌΠ΅ частоты появлСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΡƒΠΊΠ² Π² Ρ‚СкстС ΡƒΡ‡Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ… сочСтаний, Ρ‚ΠΎ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ слова Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄, прСдставлСнный Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 1 (вСроятности ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ частоту Π±ΡƒΠΊΠ²Ρ‹ Π² Ρ€ΡƒΡΡΠΊΠΎΠΌ тСкстС).

ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ сТатия опрСдСляСтся ΠΊΠ°ΠΊ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ количСства Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ тСкстС n1 ΠΊ Ρ‡ΠΈΡΠ»Ρƒ Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΡΠΆΠ°Ρ‚ΠΎΠΌ тСкстС n2 :

КсТ = n1 / n2.

РСализация

Класс Letter, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏ ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π΅, частотС, Π΅Π³ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΡƒ Π² Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅.

public class Letter

{

final char _symbol;

final float _frequency;

final char _group;

final int _index;

public char getSymbol ()

{

return _symbol;

}

public float getFreq ()

{

return _frequency;

}

public char getGroup ()

{

return _group;

}

public int getIndex ()

{

return _index;

}

Letter (char symbol, float frequency, char group, int index)

{

_symbol = symbol;

_frequency = frequency;

_group = group;

_index = index;

}

};

Класс DefaultAlphabet, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ статичСски мСсто хранСния Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ³ΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° получСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° символа Π² Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π΅:

public class DefaultAlphabet

{

public static final char characters[]=

{'a', 'b', 'c',

'd', 'e', 'f', 'g',

'h', 'i', 'j', 'k',

'l', 'm', 'n', 'o',

'p', 'q', 'r', 's',

't', 'u', 'v', 'w',

'x', 'y', 'z', ',',

'.', ';', ':', '!',

'?', '-', ' '};

public static int getId (char ch)

{

char chbuf = 'a';

int id=0;

while (ch≠chbuf)

{

id++;

chbuf=DefaultAlphabet.characters[id];

}

return id;

}

}

Класс BlockSwap, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ парсинг ΠΈ ΡˆΠΈΡ„Ρ€Π°Ρ†ΠΈΡŽ:

public class BlockSwap {

char phraseArray[];

short freq[];

int alphabetLength;

int innerAlphabetLength;

int phraseLength;

Letter innerAlphabet[];

public BlockSwap ()

{

alphabetLength = DefaultAlphabet.characters.length;

freq = new short[alphabetLength];

}

public void parse (String phrase)

{

prepare (phrase);

getPhrase ();

createInnerAlphabet ();

printInnerAlphabet ();

printInfo ();

}

private void prepare (String phrase)

{

System.out.print (phrase+" n");

phraseLength = phrase. length ();

phraseArray = phrase. toCharArray ();

}

private void getPhrase ()

{

innerAlphabetLength=0;

for (int i = 0; i

{

char symbol = phraseArray[i];

int number = DefaultAlphabet. getId (symbol);

if (freq[number]==0) innerAlphabetLength++;

freq[number]++;

}

}

private void createInnerAlphabet ()

{

innerAlphabet = new Letter[innerAlphabetLength];

int pointer=0;

int groups = (int)Math.ceil ((double)innerAlphabetLength/16);;

for (int i = 0; i < alphabetLength; i++)

{

if (freq[i]>0)

{

int group = pointer%groups;

int index = pointer/groups;

Letter buffer = new Letter (DefaultAlphabet.characters[i], (float)(freq[i])/phraseLength, DefaultAlphabet. characters[group], index);

innerAlphabet[pointer] = buffer;

pointer++;

}

}

}

private void printInnerAlphabet ()

{

for (int i = 0; i< innerAlphabetLength; i++)

{

StringBuilder sb = new StringBuilder (32);

sb.append (i);

sb.append («) '»);

sb.append (innerAlphabet[i]. getSymbol ());

sb.append («' at «);

sb.append (innerAlphabet[i]. getFreq ());

sb.append («: «);

sb.append (innerAlphabet[i]. getGroup ());

sb.append (innerAlphabet[i].getIndex ());

sb.append («n»);

System.out.printf (sb.toString ());

}

}

private void printInfo ()

{

StringBuilder message = new StringBuilder (32);

double size = 0;

char previous = 'z';

for (int i = 0; i

{

if (phraseArray[i]=='.')

{

message.append ('.');

continue;

}

int j = 0;

while (phraseArray[i]≠innerAlphabet[j]. getSymbol ())

{

j++;

}

if (innerAlphabet[j].getGroup ()≠previous)

{

size+=0.5;

previous = innerAlphabet[j]. getGroup ();

message.append (innerAlphabet[j].getGroup ());

}

size+=0.5;

message.append (innerAlphabet[j].getIndex ());

}

message.append («n ΠšΠΎΠ΅Ρ„. сТатия составил: «+(double)phraseLength/size);

System.out.print (message.toString ());

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Для выраТСния «just test it. And all I can say now: hello world!» коэффициСнт сТатия составил ΠΎΠΊΠΎΠ»ΠΎ 1.127:

Для выраТСния «my name is evgeniy gennadievich and its my first java application xd» коэффициСнт сТатия соcΡ‚Π°Π²ΠΈΠ» ΠΎΠΊΠΎΠ»ΠΎ 1.32:

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2. RSA

RSA относится ΠΊ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ асиммСтричным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ. Один ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅ΠΉ доступСн всСм (Ρ‚Π°ΠΊ дСлаСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ) ΠΈ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Π΄Ρ€ΡƒΠ³ΠΎΠΉ хранится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρƒ Π΅Π³ΠΎ хозяина ΠΈ Π½Π΅ΠΈΠ·Π²Π΅ΡΡ‚Π΅Π½ Π½ΠΈΠΊΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону. Если сообщСниС Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°, Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. ИмСя ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (ΠΎΡ‡Π΅Π½ΡŒ слоТно) Π½Π°ΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΡŽΡ‡, Ссли Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π° высока.

ОписаниС RSA

Алгоритм RSA состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ²:

1. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ простыС числа p ΠΈ q

2. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ n = p * q

3. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ m = (p — 1) * (q — 1)

4. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ число d Π²Π·Π°ΠΈΠΌΠ½ΠΎ простоС с m

5. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ число e Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ e * d = 1 (mod m)

Числа e ΠΈ d ΡΠ²Π»ΡΡŽΡ‚ся ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ RSA. Π¨ΠΈΡ„Ρ€ΡƒΠ΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° Π±Π»ΠΎΠΊΠΈ — числа ΠΎΡ‚ 0 Π΄ΠΎ n — 1. Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… производятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Β· Π¨ΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅: b = ae (mod n)

Β· Π”Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ°: a = bd (mod n)

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡ΠΈ e ΠΈ d Ρ€Π°Π²Π½ΠΎΠΏΡ€Π°Π²Π½Ρ‹, Ρ‚. Π΅. сообщСниС ΠΌΠΎΠΆΠ½ΠΎ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ e, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ d, ΠΏΡ€ΠΈ этом Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°.

Алгоритм вычислСния ad (mod m):

1. Число d ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС счислСния:

d = d0 * 2r +… + dr - 1 * 2 + dr,

Π³Π΄Π΅ di — Ρ†ΠΈΡ„Ρ€Ρ‹ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии, Ρ€Π°Π²Π½Ρ‹Π΅ 0 ΠΈΠ»ΠΈ 1, d0 = 1

2. ΠŸΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ a0 = a, Π·Π°Ρ‚Π΅ΠΌ для i = 1,…, r Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ

ai = (ai - 1) 2 * adi (mod m)

3. ar Π΅ΡΡ‚ΡŒ искомоС число ad (mod m)

Алгоритм Π•Π²ΠΊΠ»ΠΈΠ΄Π°

1. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ числа a ΠΈ b

2. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ r — остаток ΠΎΡ‚ Π΄Π΅Π»Π΅Π½ΠΈΡ a Π½Π° b: a = b * q + r

3. Если r = 0, Ρ‚ΠΎ b — искомоС число (наибольший ΠΎΠ±Ρ‰ΠΈΠΉ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ), ΠΊΠΎΠ½Π΅Ρ†

4. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ чисСл ΠΏΠ°Ρ€ΠΎΠΉ , ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ 2

ΠŸΡ€ΠΈ вычислСнии наибольшСго ΠΎΠ±Ρ‰Π΅Π³ΠΎ дСлитСля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π•Π²ΠΊΠ»ΠΈΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 5 * p ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ дСлСния с ΠΎΡΡ‚Π°Ρ‚ΠΊΠΎΠΌ, Π³Π΄Π΅ p Π΅ΡΡ‚ΡŒ количСство Ρ†ΠΈΡ„Ρ€ Π² Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΠΎΠΉ записи мСньшСго ΠΈΠ· Ρ‡ΠΈΡΠ΅Π» a ΠΈ b. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ быстро.

Алгоритм Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния a * x + b * y = 1

1. НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ E =

2. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ r — остаток ΠΎΡ‚ Π΄Π΅Π»Π΅Π½ΠΈΡ a Π½Π° b: a = b * q + r

3. Если r = 0, Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ столбСц ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π΄Π°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ½Π΅Ρ†

4. E = E *

5. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ чисСл

, ΠΏΠ°Ρ€ΠΎΠΉ , ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ 2

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ всС вычислСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ большСго ΠΈΠ· Ρ‡ΠΈΡΠ΅Π» a ΠΈ b. ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ числоq замСняСтся ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ вычитания числа q ΠΈΠ· Ρ‡ΠΈΡΠ»Π°, взятого Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ модуля. НапримСр, Ссли ΠΈΠ· Ρ‡ΠΈΡΠ΅Π» a ΠΈ b Π±ΠΎΠ»ΡŒΡˆΠΈΠΌ являСтся число b, Ρ‚ΠΎ Π²ΡΠ΅ вычислСния ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ числа b, ΠΏΡ€ΠΈ этомq Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСно ΠΊΠ°ΠΊ b — q. Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π²Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π•Π²ΠΊΠ»ΠΈΠ΄Π°, описанного Π²Ρ‹ΡˆΠ΅.

РСализация

Класс RsaEncoder выполняСт ΡˆΠΈΡ„Ρ€Π°Ρ†ΠΈΡŽ ΠΈ Π΄Π΅ΡˆΠΈΡ„Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ.

public class RsaEncoder

{

private long p, q, module, Fi;

public long openKey, closeKey;

public RsaEncoder (long openKey) throws KeyException

{

p = 3557;

q = 2579;

module = p * q;

Fi = (p-1)*(q-1);

this.openKey = openKey;

if (openKey>Fi) throw new KeyException («Key is too long»);

closeKey = modInverse (openKey, Fi);

}

long modInverse (long a, long n) {

long i = n, v = 0, d = 1;

while (a>0) {

long t = i/a, x = a;

a = i% x;

i = x;

x = d;

d = v — t*x;

v = x;

}

v%= n;

if (v<0) v = (v+n)%n;

return v;

}

public long Encode (long innerInt)

{

long buf = chinamodpow (innerInt, openKey, module);

return buf;

}

private long chinamodpow (long a, long pow, long n)

{

long res = 1;

for (int i = 0; i < (pow / 2); i++)

{

res *= ((a * a)% n);

res%= n;

}

if (pow% 2 == 1)

res *=a;

res%=n;

return res;

}

public long Decode (long innerInt)

{

long buf = chinamodpow (innerInt, closeKey, module);

return buf;

}

}

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅ 43:

ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ ΠΊΠ»ΡŽΡ‡Π΅ 2389 :

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3. ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π“ΠžΠ‘Π’

Π“ΠžΠ‘Π’ 28 147–89 — совСтский ΠΈ Ρ€ΠΎΡΡΠΈΠΉΡΠΊΠΈΠΉ стандарт симмСтричного ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π² 1990 Π³ΠΎΠ΄Ρƒ, Ρ‚Π°ΠΊΠΆΠ΅ являСтся стандартом БНГ[1]. ПолноС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ — «Π“ΠžΠ‘Π’ 28 147−89 БистСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π—Π°Ρ‰ΠΈΡ‚Π° криптографичСская. Алгоритм криптографичСского прСобразования». Π‘Π»ΠΎΡ‡Π½Ρ‹ΠΉ ΡˆΠΈΡ„Ρ€ΠΎΠ°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. ΠŸΡ€ΠΈ использовании ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ с Π³Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΡˆΠΈΡ„Ρ€ΠΎΠ°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

информация ΡˆΠΈΡ„Ρ€ криптографичСский Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹ ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ.

ОписаниС стандарта ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ Российской Π€Π΅Π΄Π΅Ρ€Π°Ρ†ΠΈΠΈ содСрТится Π² ΠΎΡ‡Π΅Π½ΡŒ интСрСсном Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅, ΠΎΠ·Π°Π³Π»Π°Π²Π»Π΅Π½Π½ΠΎΠΌ «ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌ криптографичСского прСобразования Π“ΠžΠ‘Π’ 28 147–89». Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠΈ вмСсто Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π° «ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅» Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ понятиС «ΠΊΡ€ΠΈΠΏΡ‚ографичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ «, вовсС Π½Π΅ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎ. Помимо Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тСсно связанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ описан ΠΎΠ΄ΠΈΠ½ построСнный Π½Π° ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… с Π½ΠΈΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ имитовставки. ПослСдняя являСтся Π½Π΅ Ρ‡Π΅ΠΌ ΠΈΠ½Ρ‹ΠΌ, ΠΊΠ°ΠΊ криптографичСской ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΎΠΌ, Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ ΠΈΠ· ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ сСкрСтного ΠΊΠ»ΡŽΡ‡Π° с Ρ†Π΅Π»ΡŒΡŽ ΠΈΠΌΠΈΡ‚ΠΎΠ·Π°Ρ‰ΠΈΡ‚Ρ‹, ΠΈΠ»ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π² Π½ΠΈΡ… нСсанкционированных ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

На Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΡˆΠ°Π³Π°Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π“ΠžΠ‘Π’Π° Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ массивы нСзависимых Π±ΠΈΡ‚ΠΎΠ², Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… случаях — ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ число Π±Π΅Π· Π·Π½Π°ΠΊΠ°, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ… — ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ структуру слоТный элСмСнт, состоящий ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±ΠΎΠ»Π΅Π΅ простых элСмСнтов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹ слСдуСт Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… обозначСниях.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌΠΈ латинскими Π±ΡƒΠΊΠ²Π°ΠΌΠΈ с Π½Π°ΠΊΠ»ΠΎΠ½Π½Ρ‹ΠΌ Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠ΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, X). Π§Π΅Ρ€Π΅Π· |X| обозначаСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… X Π² Π±ΠΈΡ‚Π°Ρ…. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… X ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ нСравСнство:.

Если элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ ΡΡ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ обозначаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: X=(X 0,X 1,…,Xn —1)=X 0||X 1||…||Xn —1. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° объСдинСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄ΠΈΠ½ называСтся ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠ΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ся символом «||». ЕстСствСнно, для Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅: |X|=|X 0|+|X 1|+…+|Xn -1|. ΠŸΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ слоТных элСмСнтов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Π² ΠΏΠΎΡ€ΡΠ΄ΠΊΠ΅ возрастания ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π°. Π˜Π½Ρ‹ΠΌΠΈ словами, Ссли ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ составной элСмСнт ΠΈ Π²ΡΠ΅ входящиС Π² Π½Π΅Π³ΠΎ элСмСнты Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ числа Π±Π΅Π· Π·Π½Π°ΠΊΠ°, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ равСнство:

Π’ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ², Π² ΡΡ‚ΠΎΠΌ случаС Π±ΠΈΡ‚Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅ΠΌ Ρ‚ΠΎΠΉ ΠΆΠ΅ самой Π±ΡƒΠΊΠ²ΠΎΠΉ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΌΠ°ΡΡΠΈΠ², Π½ΠΎ Π² ΡΡ‚Ρ€ΠΎΡ‡Π½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

X=(x 0,x 1,…,xn —1)=x 0+21Β· x 1+…+2 n-1Β· xn —1.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, для Π“ΠžΠ‘Π’Π° принята Ρ‚.Π½. «little-endian» нумСрация разрядов, Ρ‚. Π΅. Π²Π½ΡƒΡ‚Ρ€ΠΈ многоразрядных слов Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ разряды ΠΈ ΠΈΡ… Π³Ρ€ΡƒΠΏΠΏΡ‹ с ΠΌΠ΅Π½ΡŒΡˆΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌΠΈ. Об ΡΡ‚ΠΎΠΌ прямо говорится Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 1.3 стандарта: «ΠŸΡ€ΠΈ слоТСнии ΠΈ Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅ΡΠΊΠΎΠΌ сдвигС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΡΡ‚Π°Ρ€ΡˆΠΈΠΌΠΈ разрядами ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ разряды Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ с Π±ΠΎΠ»ΡŒΡˆΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ». Π”Π°Π»Π΅Π΅, ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ стандарта 1.4, 2.1.1 ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ рСгистров-Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‰Π΅Π³ΠΎ устройства с ΠΌΠ»Π°Π΄ΡˆΠΈΡ…, Ρ‚. Π΅. ΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… разрядов. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ порядок Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ принят Π² ΠΌΠΈΠΊΡ€ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Intel x86, ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡˆΠΈΡ„Ρ€Π° Π½Π° Π΄Π°Π½Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… пСрСстановок разрядов Π²Π½ΡƒΡ‚Ρ€ΠΈ слов Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Ρ‚рСбуСтся.

Если Π½Π°Π΄ элСмСнтами Π΄Π°Π½Π½Ρ‹Ρ… выполняСтся нСкоторая опСрация, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ логичСский смысл, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ся, Ρ‡Ρ‚ΠΎ данная опСрация выполняСтся Π½Π°Π΄ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ элСмСнтов. Π˜Π½Ρ‹ΠΌΠΈ словами A*B=(a 0*b 0,a 1*b 1,…,an —1*bn —1), Π³Π΄Π΅ n=|A|=|B|, Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ «*» обозначаСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Π°Ρ бинарная логичСская опСрация; ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, имССтся Π² Π²ΠΈΠ΄Ρƒ опСрация ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ»ΠΈ, ΠΎΠ½Π° ΠΆΠ΅ — опСрация суммирования ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ2:

Π›ΠΎΠ³ΠΈΠΊΠ° построСния ΡˆΠΈΡ„Ρ€Π° ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π“ΠžΠ‘Π’Π°.

Если Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» Π“ΠžΠ‘Π’ 28 147–89, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ содСрТится описаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ. На ΡΠ°ΠΌΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ находятся практичСскиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ массивов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ для Π½ΠΈΡ… имитовставки. ВсС ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° Ρ‚Ρ€ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° низшСго уровня, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π² Ρ‚СкстС Π“ΠžΠ‘Π’Π° Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚ Π²ΡΠ΅Ρ… ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ². Они ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ названия ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΡ, послСдниС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ… ΠΈ ΡΠΌΡ‹ΡΠ» ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ объяснСн ΠΏΠΎΠ·ΠΆΠ΅:

§ Ρ†ΠΈΠΊΠ» Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (32-Π—);

§ Ρ†ΠΈΠΊΠ» Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (32-Π );

§ Ρ†ΠΈΠΊΠ» Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ имитовставки (16-Π—).

Π’ ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² прСдставляСт собой ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ СдинствСнной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ для опрСдСлСнности Π΄Π°Π»Π΅Π΅ Π² Π½Π°ΡΡ‚оящСй Ρ€Π°Π±ΠΎΡ‚Π΅ основным шагом криптопрСобразования.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π“ΠžΠ‘Π’Π΅, Π½Π°Π΄ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ:

§ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ основной шаг криптопрСобразования;

§ ΠΊΠ°ΠΊ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½Ρ‹Ρ… шагов ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹;

§ ΠΊΠ°ΠΊ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ всС практичСскиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π“ΠžΠ‘Π’Π°.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ этих вопросов, слСдуСт ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ Π“ΠžΠ‘Π’Π°. Π’ ΡΠΎΠΎΡ‚вСтствии с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ ΠšΠΈΡ€Ρ…Π³ΠΎΡ„Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ всС соврСмСнныС извСстныС ΡˆΠΈΡ€ΠΎΠΊΠΎΠΉ общСствСнности ΡˆΠΈΡ„Ρ€Ρ‹, ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π΅ ΡΠ΅ΠΊΡ€Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ обСспСчиваСт ΡΠ΅ΠΊΡ€Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ сообщСния. Π’ Π“ΠžΠ‘Π’Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Π°Ρ информация состоит ΠΈΠ· Π΄Π²ΡƒΡ… структур Π΄Π°Π½Π½Ρ‹Ρ…. Помимо собствСнно ΠΊΠ»ΡŽΡ‡Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для всСх ΡˆΠΈΡ„Ρ€ΠΎΠ², ΠΎΠ½Π° содСрТит Π΅Ρ‰Π΅ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π·Π°ΠΌΠ΅Π½. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ основныС характСристики ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… структур Π“ΠžΠ‘Π’Π°.

Β§ ΠšΠ»ΡŽΡ‡ являСтся массивом ΠΈΠ· Π²ΠΎΡΡŒΠΌΠΈ 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… элСмСнтов ΠΊΠΎΠ΄Π°, Π΄Π°Π»Π΅Π΅ Π² Π½Π°ΡΡ‚оящСй Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΎΠ½ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ся символом K: Π’ Π“ΠžΠ‘Π’Π΅ элСмСнты ΠΊΠ»ΡŽΡ‡Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ 32-разрядныС Ρ†Π΅Π»Ρ‹Π΅ числа Π±Π΅Π· Π·Π½Π°ΠΊΠ°:. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ»ΡŽΡ‡Π° составляСт 32Β· 8=256 Π±ΠΈΡ‚ ΠΈΠ»ΠΈ 32 Π±Π°ΠΉΡ‚Π°.

Β§ Π’Π°Π±Π»ΠΈΡ†Π° Π·Π°ΠΌΠ΅Π½ являСтся Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, содСрТащим восСмь ΡƒΠ·Π»ΠΎΠ² Π·Π°ΠΌΠ΅Π½Ρ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π·Π°ΠΌΠ΅Π½Ρ‹, Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, являСтся Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, содСрТащим ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ 4-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… элСмСнтов Π·Π°ΠΌΠ΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΎΡ‚ 0 Π΄ΠΎ 15, всС элСмСнты ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π·Π°ΠΌΠ΅Π½Ρ‹ обязаны Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π°ΠΌΠ΅Π½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСна Π² Π²ΠΈΠ΄Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 8×16 ΠΈΠ»ΠΈ 16×8, содСрТащСй 4-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ значСния. Для языков программирования, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы располоТСны Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΠΏΠΎ ΡΡ‚Ρ€ΠΎΠΊΠ°ΠΌ, СстСствСнным являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (8×16), Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΌΡ‹ ΠΈ Π²ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρƒ. Π’ΠΎΠ³Π΄Π° ΡƒΠ·Π»Ρ‹ Π·Π°ΠΌΠ΅Π½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ строками Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½. Π’ Π½Π°ΡΡ‚оящСй ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π°ΠΌΠ΅Π½ обозначаСтся символом H:. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ‰ΠΈΠΉ объСм Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½ Ρ€Π°Π²Π΅Π½: 8 ΡƒΠ·Π»ΠΎΠ² x 16 элСмСнтов/ΡƒΠ·Π΅Π» x 4 Π±ΠΈΡ‚Π°/элСмСнт = 512 Π±ΠΈΡ‚ = 64 Π±Π°ΠΉΡ‚Π°.

Основной шаг криптопрСобразования.

Основной шаг криптопрСобразования ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ сути являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ 64-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° являСтся 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ, Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ элСмСнт ΠΊΠ»ΡŽΡ‡Π°. Π‘Ρ…Π΅ΠΌΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° основного шага ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 1.

Π¨Π°Π³ 0

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ исходныС Π΄Π°Π½Π½Ρ‹Π΅ для основного шага криптопрСобразования:

Β§ N — ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΡ‹ΠΉ 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ…ΠΎΠ΄Π΅ выполнСния шага Π΅Π³ΠΎ младшая (N 1) ΠΈ ΡΡ‚Π°Ρ€ΡˆΠ°Ρ (N 2) части ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа Π±Π΅Π· Π·Π½Π°ΠΊΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ N=(N1,N2).

Β§ X — 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ элСмСнт ΠΊΠ»ΡŽΡ‡Π°;

Π¨Π°Π³ 1

Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Младшая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° складываСтся ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 232 с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π½Π° ΡˆΠ°Π³Π΅ элСмСнтом ΠΊΠ»ΡŽΡ‡Π°, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСдаСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг;

Π¨Π°Π³ 2

ΠŸΠΎΠ±Π»ΠΎΡ‡Π½Π°Ρ Π·Π°ΠΌΠ΅Π½Π°. 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС, интСрпрСтируСтся ΠΊΠ°ΠΊ массив ΠΈΠ· Π²ΠΎΡΡŒΠΌΠΈ 4-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°: S=(S 0, S 1, S 2, S 3, S 4, S 5, S 6, S 7), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ S 0содСрТит 4 самых ΠΌΠ»Π°Π΄ΡˆΠΈΡ…, Π° S 7 — 4 самых ΡΡ‚Π°Ρ€ΡˆΠΈΡ… Π±ΠΈΡ‚Π° S.

Π”Π°Π»Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π²ΠΎΡΡŒΠΌΠΈ Π±Π»ΠΎΠΊΠΎΠ² замСняСтся Π½ΠΎΠ²Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выбираСтся ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π·Π°ΠΌΠ΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠ° Si мСняСтся Π½Π° Si-Ρ‚Ρ‹ΠΉ ΠΏΠΎ ΠΏΠΎΡ€ΡΠ΄ΠΊΡƒ элСмСнт (нумСрация с Π½ΡƒΠ»Ρ) i-Ρ‚ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π·Π°ΠΌΠ΅Π½Ρ‹ (Ρ‚.Π΅. i-Ρ‚ΠΎΠΉ строки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½, нумСрация Ρ‚Π°ΠΊΠΆΠ΅ с Π½ΡƒΠ»Ρ). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π·Π°ΠΌΠ΅Π½Ρ‹ для значСния Π±Π»ΠΎΠΊΠ° выбираСтся элСмСнт ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки, Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Ρƒ замСняСмого Π±Π»ΠΎΠΊΠ°, ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ столбца, Ρ€Π°Π²Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ замСняСмого Π±Π»ΠΎΠΊΠ° ΠΊΠ°ΠΊ 4-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ числа. ΠžΡ‚ΡΡŽΠ΄Π° становится понятным Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½: число строк Π² Π½Π΅ΠΉ Ρ€Π°Π²Π½ΠΎ числу 4-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… элСмСнтов Π² 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ восьми, Π° Ρ‡ΠΈΡΠ»ΠΎ столбцов Ρ€Π°Π²Π½ΠΎ числу Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 4-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π²Π½ΠΎΠΌΡƒ ΠΊΠ°ΠΊ извСстно 24, ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈ.

Π¨Π°Π³ 3

ЦикличСский сдвиг Π½Π° 11 Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ шага сдвигаСтся цикличСски Π½Π° 11 Π±ΠΈΡ‚ Π² ΡΡ‚ΠΎΡ€ΠΎΠ½Ρƒ ΡΡ‚Π°Ρ€ΡˆΠΈΡ… разрядов ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг. На ΡΡ…Π΅ΠΌΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° символом ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π° функция цикличСского сдвига своСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π° 11 Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ, Ρ‚. Π΅. Π² ΡΡ‚ΠΎΡ€ΠΎΠ½Ρƒ ΡΡ‚Π°Ρ€ΡˆΠΈΡ… разрядов.

Π¨Π°Π³ 4

ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ слоТСниС: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΡˆΠ°Π³Π΅ 3, ΠΏΠΎΠ±ΠΈΡ‚Π½ΠΎ складываСтся ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2 со ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.

Π¨Π°Π³ 5

Π‘Π΄Π²ΠΈΠ³ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅: младшая Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° сдвигаСтся Π½Π° ΠΌΠ΅ΡΡ‚ΠΎ ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΉ, Π° Π½Π° Π΅Π΅ мСсто помСщаСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ шага.

Π¨Π°Π³ 6

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° возвращаСтся ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° основного шага криптопрСобразования.

Рис. 1.

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ криптографичСских ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ.

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ настоящСй ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π“ΠžΠ‘Π’ относится ΠΊ ΠΊΠ»Π°ΡΡΡƒ Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… ΡˆΠΈΡ„Ρ€ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Π½Π΅ΠΌ являСтся Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для криптографичСских ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ, Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ «ΡƒΡ‡Π΅Ρ‚Π°» Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…. ИмСнно эти Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ся Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ Π“ΠžΠ‘Π’Π°, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚ ΠΈΡ… Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для построСния этого ΡˆΠΈΡ„Ρ€Π°.

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ построСны ΠΈΠ· основных шагов криптографичСского прСобразования, рассмотрСнного Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ выполнСния основного шага ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ элСмСнт ΠΊΠ»ΡŽΡ‡Π°, Π² Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΡ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ Π“ΠžΠ‘Π’Π° содСрТит восСмь Ρ‚Π°ΠΊΠΈΡ… элСмСнтов. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΡŽΡ‡ Π±Ρ‹Π» использован ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ основной шаг с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π΅Π³ΠΎ элСмСнтами. ВмСстС с Ρ‚Π΅ΠΌ каТСтся Π²ΠΏΠΎΠ»Π½Π΅ СстСствСнным, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ всС элСмСнты ΠΊΠ»ΡŽΡ‡Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ число Ρ€Π°Π·, ΠΏΠΎ ΡΠΎΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡΠΌ стойкости ΡˆΠΈΡ„Ρ€Π° это число Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ.

ВсС сдСланныС Π²Ρ‹ΡˆΠ΅ прСдполоТСния, ΠΎΠΏΠΈΡ€Π°ΡŽΡ‰ΠΈΠ΅ΡΡ просто Π½Π° Π·Π΄Ρ€Π°Π²Ρ‹ΠΉ смысл, оказались Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ основного шага с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… элСмСнтов ΠΊΠ»ΡŽΡ‡Π° ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числом повторСния шага ΠΈ ΠΏΠΎΡ€ΡΠ΄ΠΊΠΎΠΌ использования ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… элСмСнтов. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ этот порядок для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ².

Π¦ΠΈΠΊΠ» Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ 32-Π—:

K 0,K 1,K 2,K 3,K 4,K 5,K 6,K 7,K 0,K 1,K 2,K 3,K 4,K 5,K 6,K 7,K 0,K 1,K 2,K 3,K 4,K 5,K 6,K 7,K 7,K 6,K 5,K 4,K 3,K 2,K 1,K 0.

Π¦ΠΈΠΊΠ» Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ 32-Π :

K 0,K 1,K 2,K 3,K 4,K 5,K 6,K 7,K 7,K 6,K 5,K 4,K 3,K 2,K 1,K 0,K 7,K 6,K 5,K 4,K 3,K 2,K 1,K 0,K 7,K 6,K 5,K 4,K 3,K 2,K 1,K 0.

Π—Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° 32-Π— ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅ — Ρ†ΠΈΠΊΠ»Π° 32-Π  ΠΊ Π±Π»ΠΎΠΊΠ°ΠΌ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простой ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠΎΠ², 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Π½Π΅ΠΌ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°. Π‘Ρ…Π΅ΠΌΡ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Ρ€Π°ΡΡˆΠΈΡ„рования Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ простой Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ°Ρ… 3Π° ΠΈ Π± ΡΠΎΠΎΡ‚вСтствСнно, ΠΎΠ½ΠΈ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ ΠΈ Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ся Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ариях.

Π Π°Π·ΠΌΠ΅Ρ€ массива ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΈΠ»ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‰ΠΈΠΉΡΡ соотвСтствСнно Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡŽ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°Ρ‚Π΅Π½ 64 Π±ΠΈΡ‚Π°ΠΌ: | T ΠΎ|=| T ш|=64Β· n, послС выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ‚ся.

Π Π΅ΠΆΠΈΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ простой Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ особСнности:

§ Π’Π°ΠΊ ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΡˆΠΈΡ„Ρ€ΡƒΡŽΡ‚ΡΡ нСзависимо Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΈ ΠΎΡ‚ ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π²ΡƒΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ тСкста ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΡˆΠΈΡ„Ρ€Ρ‚Π΅ΠΊΡΡ‚Π° ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ΠžΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ΅ свойство ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚оТдСствСнности Π±Π»ΠΎΠΊΠΎΠ² исходных Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΠΌΡƒ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ, Ρ‡Ρ‚ΠΎ являСтся нСдопустимым для ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ³ΠΎ ΡˆΠΈΡ„Ρ€Π°.

§ Если Π΄Π»ΠΈΠ½Π° ΡˆΠΈΡ„Ρ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ ΠΊΡ€Π°Ρ‚Π½Π° 8 Π±Π°ΠΉΡ‚Π°ΠΌ ΠΈΠ»ΠΈ 64 Π±ΠΈΡ‚Π°ΠΌ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ρ‡Π΅ΠΌ ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ послСдний Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… массива Π΄ΠΎ ΠΏΠΎΠ»Π½Ρ‹Ρ… 64 Π±ΠΈΡ‚. Π­Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ Ρ‚Π°ΠΊ проста, ΠΊΠ°ΠΊ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° «Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ Π±ΠΈΡ‚Π°ΠΌΠΈ» ΠΈΠ»ΠΈ, Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅, «Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ фиксированной ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΡ‚ΠΎΠ²» ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… условиях Π΄Π°Ρ‚ΡŒ Π² Ρ€ΡƒΠΊΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ содСрТимоС этого самого Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°, ΠΈ ΡΡ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ сниТСниС стойкости ΡˆΠΈΡ„Ρ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄Π»ΠΈΠ½Π° ΡˆΠΈΡ„Ρ€Ρ‚Π΅ΠΊΡΡ‚Π° ΠΏΡ€ΠΈ этом измСнится, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ Π΄ΠΎ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠ΅Π³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ, ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ 64 Π±ΠΈΡ‚Π°ΠΌ, Ρ‡Ρ‚ΠΎ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ.

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ особСнности Π΄Π΅Π»Π°ΡŽΡ‚ практичСски Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ использованиС Ρ€Π΅ΠΆΠΈΠΌΠ° простой Π·Π°ΠΌΠ΅Π½Ρ‹, вСдь ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ массивов Π΄Π°Π½Π½Ρ‹Ρ… с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌ 64 Π±ΠΈΡ‚Π°ΠΌ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΠΈΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ 64-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ для Π»ΡŽΠ±Ρ‹Ρ… Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… условий Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π­Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: вспомнитС, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ»ΡŽΡ‡Π° составляСт 32 Π±Π°ΠΉΡ‚Π°, Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½ — 64 Π±Π°ΠΉΡ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ 8-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² Π² ΠΊΠ»ΡŽΡ‡Π΅ ΠΈΠ»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π·Π°ΠΌΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± ΠΈΡ… Π²Π΅ΡΡŒΠΌΠ° ΠΏΠ»ΠΎΡ…ΠΎΠΌ качСствС, поэтому Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… элСмСнтах Ρ‚Π°ΠΊΠΎΠ³ΠΎ повторСния Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΆΠΈΠΌ простой Π·Π°ΠΌΠ΅Π½Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ для этой Ρ†Π΅Π»ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта Π΄Π°Π½Π½Ρ‹Ρ… — синхропосылки (см. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»). Наша Π΄ΠΎΠ³Π°Π΄ΠΊΠ° Π²Π΅Ρ€Π½Π°, Π“ΠžΠ‘Π’ прСдписываСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ простой Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

РСализация

Класс BytesChopper, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉΡΡ для расщСплСния Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΠΈ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π½Π° Π±Π»ΠΎΠΊΠΈ ΠΏΠΎ 64 Π±ΠΈΡ‚Π°:

public class BytesChopper

{

private byte[] _bytesToChop;

private byte[][] _outerBytesContainer;

public int BlocksCount

{

get;

private set;

}

public BytesChopper (string innerString)

{

_bytesToChop = Encoding.Default.GetBytes (innerString);

MakeChopping ();

}

public BytesChopper (byte[] bytes)

{

_bytesToChop = bytes;

MakeChopping ();

}

public byte[] Get (int packageNumber)

{

return _outerBytesContainer[packageNumber];

}

private void MakeChopping ()

{

if (_bytesToChop.Length%8≠0) throw new ArgumentException («Wrong inner line length,%64≠0»);

int partitions = Convert. ToInt32(Math.Ceiling ((double)_bytesToChop. Count () / 8));

_outerBytesContainer = new byte[partitions][];

for (int i = 0; i < partitions; i++)

{

_outerBytesContainer[i] = ChopBytes (i);

}

BlocksCount = partitions;

}

private byte[] ChopBytes (int numOfChunk)

{

byte[] buf = new byte[8];

byte length = (byte)Math.Min (8, _bytesToChop.Length — numOfChunk * 8);

int i;

for (i = 0; i < length; i++)

{

buf[i] = _bytesToChop[numOfChunk * 8 + i];

}

return buf;

}

}

Класс BitWorker для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΡ‚Π°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΡƒΠΈΠ½Ρ‚ΠΎΠ²:

public static class BitWorker

{

/// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±ΠΈΡ‚ Π² num Π±Π°ΠΉΡ‚Π΅ val

///Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±Π°ΠΉΡ‚

///НомСр Π±ΠΈΡ‚Π°, начиная с 0

///true-Π±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ 1, falseΠ±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ 0

public static bool GetBit (byte val, int num)

{

if ((num > 7) || (num < 0))//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

{

throw new ArgumentException ();

}

return ((val >> num) & 1) > 0;//собствСнно всС вычислСния

}

public static bool GetBit (uint val, int num)

{

if ((num > 31) || (num < 0))//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

{

throw new ArgumentException ();

}

return ((val >> num) & 1) > 0;//собствСнно всС вычислСния

}

/// УстанавливаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° Π² Π±Π°ΠΉΡ‚Π΅

///Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±Π°ΠΉΡ‚

///НомСр Π±ΠΈΡ‚Π°

///Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΡ‚Π°: true-Π±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ 1, falseΠ±ΠΈΡ‚ Ρ€Π°Π²Π΅Π½ 0

///Π‘Π°ΠΉΡ‚, с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π±ΠΈΡ‚Π°

public static byte SetBit (byte val, int num, bool bit)

{

if ((num > 7) || (num < 0))//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

{

throw new ArgumentException ();

}

byte tmpval = 1;

tmpval = (byte)(tmpval << num);//устанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ

val = (byte)(val & (~tmpval));//сбрасываСм Π² 0 Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚

if (bit)// Ссли Π±ΠΈΡ‚ трСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² 1

(tmpval));//Ρ‚ΠΎ устанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² 1

return val;

}

public static uint SetBit (uint val, int num, bool bit)

{

if ((num > 31) || (num < 0))//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

{

throw new ArgumentException ();

}

uint tmpval = 1;

tmpval = (uint)(tmpval << num);//устанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ

val = (uint)(val & (~tmpval));//сбрасываСм Π² 0 Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚

if (bit)// Ссли Π±ΠΈΡ‚ трСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² 1

(tmpval));//Ρ‚ΠΎ устанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΡ‚ Π² 1

return val;

}

/// Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ порядок Π±ΠΈΡ‚ΠΎΠ² Π½Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ

///Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉΠ±Π°ΠΉΡ‚

///Π‘Π°ΠΉΡ‚ с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ порядком Π±ΠΈΡ‚ΠΎΠ²

public static byte Reverse (byte val)

{

int i = 0;

byte rez = 0;

for (i = 0; i < 8; i++)

{

rez = (byte)(rez << 1);

if (((val >> i) & 1) > 0)

1);

}

return rez;

}

public static uint Reverse (uint val)

{

int i = 0;

uint rez = 0;

for (i = 0; i < 32; i++)

{

rez = rez << 1;

if (((val >> i) & 1) > 0)

1;

}

return rez;

}

}

Класс Key для хранСния ΠΊΠ»ΡŽΡ‡Π°.

public class Key

{

public readonly byte[] KeyBytes;

public readonly string KeyString;

// ReSharper disable once UnassignedReadonlyField

public readonly uint[] KeyUints;

public Key (string key)

{

if (key.Length≠64) throw new ArgumentException («Wrong key string length, key must have 64 letters, its 32 bytes, its 256 bits»);

KeyString = key;

KeyBytes = new byte[32];

KeyUints = new uint[8];

byte[] buf = MathBlock. FromHex (key);

for (int i = 0; i < buf. Length; i++)

{

KeyBytes[i] = buf[i];

}

FillKeyUints ();

}

// ReSharper disable once RedundantAssignment

private void FillKeyUints ()

{

KeyUints[0] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[31]), BitWorker. Reverse (KeyBytes[30]), BitWorker. Reverse (KeyBytes[29]), BitWorker. Reverse (KeyBytes[28]));

KeyUints[1] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[27]), BitWorker. Reverse (KeyBytes[26]), BitWorker. Reverse (KeyBytes[25]), BitWorker. Reverse (KeyBytes[24]));

KeyUints[2] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[23]), BitWorker. Reverse (KeyBytes[22]), BitWorker. Reverse (KeyBytes[21]), BitWorker. Reverse (KeyBytes[20]));

KeyUints[3] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[19]), BitWorker. Reverse (KeyBytes[18]), BitWorker. Reverse (KeyBytes[17]), BitWorker. Reverse (KeyBytes[16]));

KeyUints[4] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[15]), BitWorker. Reverse (KeyBytes[14]), BitWorker. Reverse (KeyBytes[13]), BitWorker. Reverse (KeyBytes[12]));

KeyUints[5] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[11]), BitWorker. Reverse (KeyBytes[10]), BitWorker. Reverse (KeyBytes[9]), BitWorker. Reverse (KeyBytes[8]));

KeyUints[6] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[7]), BitWorker. Reverse (KeyBytes[6]), BitWorker. Reverse (KeyBytes[5]), BitWorker. Reverse (KeyBytes[4]));

KeyUints[7] = MathBlock. FourBytesToUint (BitWorker.Reverse (KeyBytes[3]), BitWorker. Reverse (KeyBytes[2]), BitWorker. Reverse (KeyBytes[1]), BitWorker. Reverse (KeyBytes[0]));

}

}

Класс MathBlock для матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

public static class MathBlock

{

public static uint FourBytesToUint (byte first, byte second, byte third, byte fourth)

{

return ShiftLeft (first, 24) + ShiftLeft (second, 16) + ShiftLeft (third, 8) + fourth;

}

public static byte[] UintToByteArray (uint innerUint)

{

return BitConverter. GetBytes (innerUint);

}

public static uint RotateLeft (uint value, int count)

int bitsize = sizeof (uint) * 8;

// Π’Ρ‹Ρ€Π΅Π·Π°Π΅ΠΌ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ n Π±ΠΈΡ‚

uint hi = (uint)((value >> (bitsize — count)) & ((1 << count) — 1));

// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° n Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ, ΠΏΡ€ΠΈ этом младшая Ρ‡Π°ΡΡ‚ΡŒ заполнится

// нулями, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ or’ΠΎΠΌ записываСм Ρ‚ΡƒΠ΄Π° Π²Ρ‹Ρ€Π΅Π·Π°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ€ΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ

return (value << count)

public static byte RotateLeft (byte value, int count)

int bitsize = sizeof (byte) * 8;

// Π’Ρ‹Ρ€Π΅Π·Π°Π΅ΠΌ ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ n Π±ΠΈΡ‚

byte hi = (byte)((value >> (bitsize — count)) & ((1 << count) — 1));

// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π° n Π±ΠΈΡ‚ Π²Π»Π΅Π²ΠΎ, ΠΏΡ€ΠΈ этом младшая Ρ‡Π°ΡΡ‚ΡŒ заполнится

// нулями, Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ or’ΠΎΠΌ записываСм Ρ‚ΡƒΠ΄Π° Π²Ρ‹Ρ€Π΅Π·Π°Π½Π½ΡƒΡŽ ΡΡ‚Π°Ρ€ΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ

return (byte)((value << count)

public static uint ShiftLeft (uint innerUint, int position)

{

return innerUint << position;

}

public static uint ShiftLeft (byte byteToShift, int position)

{

return (uint)(byteToShift) << position;

}

public static uint AddMod (uint firstUint, uint secondUint, int pow)

{

return Mod ((firstUint + secondUint), pow);

}

public static uint Xor (uint firstUint, uint secondUint)

{

return firstUint ^ secondUint;

}

public static uint Mod (uint innerUint, int pow)

{

return (uint)(innerUint% (long)Math.Pow (2, pow));

}

public static string ToHex (byte[] input)

{

string hexOutput = «» ;

foreach (byte letter in input)

{

int value = Convert. ToInt32(letter);

hexOutput += string. Format («{0:X}», value);

if (value == 0) hexOutput += string. Format («{0:X}», value);

}

return hexOutput. ToLower ();

}

public static byte[] FromHex (string input)

{

input = input. ToLower ();

if (input.Length%2 ≠ 0) input = '0' + input;

int length = input. Length / 2;

byte[] answer = new byte[length];

string buf;

for (int i = 0; i < length; i++)

{

buf = input. Substring (i * 2, 2);

byte value = Convert. ToByte (buf, 16);

answer[i] = value;

}

return answer;

}

}

Класс SBlock для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π·Π°ΠΌΠ΅Π½:

public class SBlock

{

//[Stroka, stolbec]

public readonly static byte[,] Bytes =

{

{4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3},

{14,11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9},

{5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11},

{7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3},

{6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2},

{4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14},

{13,11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12},

{1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12}

};

}

Абстрактный класс EncryptionTemplateMethod ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Encoder ΠΈ Decoder, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΡˆΠΈΡ„Ρ€Π°Ρ†ΠΈΠΈ-Π΄Π΅ΡˆΠΈΡ„Ρ€Π°Ρ†ΠΈΠΈ. Использован ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ TemplateMethod для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° PrepareKeys (string key):

internal abstract class EncryptionTemplateMethod

{

protected uint[] N;

protected uint[] Keys;

protected uint OperationsBuffer;

public uint[] State

{

get { return N; }

}

protected EncryptionTemplateMethod (string key)

{

N = new uint[2];

Keys = new uint[32];

PrepareKeys (key);

}

//Template method will be implemented in Encoder and Decoder realisation

protected abstract void PrepareKeys (string key);

protected void PrepareRegisters (byte[] innerBytes)

{

if (innerBytes.Length ≠ 8) throw new ArgumentException («Partition must be 8 bytes long»);

N[0] = MathBlock. FourBytesToUint (innerBytes[3], innerBytes[2], innerBytes[1], innerBytes[0]);

N[1] = MathBlock. FourBytesToUint (innerBytes[7], innerBytes[6], innerBytes[5], innerBytes[4]);

}

public void Process (byte[] innerBytes)

{

PrepareRegisters (innerBytes);

for (int i = 0; i < 32; i++)

{

Round (i);

}

}

protected void Round (int number)

AddKey (Keys[number]);

SwapBlocks ();

RotateBufferLeft ();

XOROperation ();

ExchangeRegisters (number);

Debug.WriteLine (number+ «: «+N[0]+ «

//step 1

protected void AddKey (uint key)

{

OperationsBuffer = MathBlock. AddMod (N[0], key, 32);

}

//step 2

protected void SwapBlocks ()

{

byte[] block = SplitUintToFourBitsArray (OperationsBuffer);

SwapBytes (block);

OperationsBuffer = AgglutinateBytes (block);

}

protected byte[] SplitUintToFourBitsArray (uint innerUint)

{

int i, j;

byte[] buffer = new byte[8];

for (i = 0; i < 8; i++)

{

for (j = 0; j < 4; j++)

{

BitWorker.SetBit (buffer[i], j, BitWorker. GetBit (innerUint, i * 4 + j));

}

}

return buffer;

}

protected byte[] SwapBytes (byte[] innerBytes)

{

int i;

int length = innerBytes. Length;

for (i = 0; i < length; i++)

{

innerBytes[i] = SBlock. Bytes[i, innerBytes[i]];

}

return innerBytes;

}

protected uint AgglutinateBytes (byte[] innerBytes)

{

uint buf = 0;

int i, j;

bool bit;

for (i = 0; i < 8; i++)

{

for (j = 0; j < 4; j++)

{

bit = BitWorker. GetBit (innerBytes[i], j);

buf = BitWorker. SetBit (buf, j + i * 4, bit);

}

}

return buf;

}

//step 3

protected void RotateBufferLeft ()

{

OperationsBuffer = MathBlock. RotateLeft (OperationsBuffer, 11);

}

//step 4

protected void XOROperation ()

{

OperationsBuffer = MathBlock. Xor (OperationsBuffer, N[1]);

}

//step 5

protected void ExchangeRegisters (int number)

{

if (number < 31)

{

N[1] = N[0];

N[0] = OperationsBuffer;

}

else

{

N[1] = OperationsBuffer;

}

}

}

internal class Encoder: EncryptionTemplateMethod

{

public Encoder (string key): base (key)

{

}

protected override void PrepareKeys (string key)

{

Key k = new Key (key);

Keys[0] = k. KeyUints[0];

Keys[1] = k. KeyUints[1];

Keys[2] = k. KeyUints[2];

Keys[3] = k. KeyUints[3];

Keys[4] = k. KeyUints[4];

Keys[5] = k. KeyUints[5];

Keys[6] = k. KeyUints[6];

Keys[7] = k. KeyUints[7];

Keys[8] = k. KeyUints[0];

Keys[9] = k. KeyUints[1];

Keys[10] = k. KeyUints[2];

Keys[11] = k. KeyUints[3];

Keys[12] = k. KeyUints[4];

Keys[13] = k. KeyUints[5];

Keys[14] = k. KeyUints[6];

Keys[15] = k. KeyUints[7];

Keys[16] = k. KeyUints[0];

Keys[17] = k. KeyUints[1];

Keys[18] = k. KeyUints[2];

Keys[19] = k. KeyUints[3];

Keys[20] = k. KeyUints[4];

Keys[21] = k. KeyUints[5];

Keys[22] = k. KeyUints[6];

Keys[23] = k. KeyUints[7];

Keys[24] = k. KeyUints[7];

Keys[25] = k. KeyUints[6];

Keys[26] = k. KeyUints[5];

Keys[27] = k. KeyUints[4];

Keys[28] = k. KeyUints[3];

Keys[29] = k. KeyUints[2];

Keys[30] = k. KeyUints[1];

Keys[31] = k. KeyUints[0];

}

}

internal class Decoder: EncryptionTemplateMethod

{

public Decoder (string key): base (key)

{

}

protected override void PrepareKeys (string key)

{

Key k = new Key (key);

Keys[0] = k. KeyUints[0];

Keys[1] = k. KeyUints[1];

Keys[2] = k. KeyUints[2];

Keys[3] = k. KeyUints[3];

Keys[4] = k. KeyUints[4];

Keys[5] = k. KeyUints[5];

Keys[6] = k. KeyUints[6];

Keys[7] = k. KeyUints[7];

Keys[8] = k. KeyUints[7];

Keys[9] = k. KeyUints[6];

Keys[10] = k. KeyUints[5];

Keys[11] = k. KeyUints[4];

Keys[12] = k. KeyUints[3];

Keys[13] = k. KeyUints[2];

Keys[14] = k. KeyUints[1];

Keys[15] = k. KeyUints[0];

Keys[16] = k. KeyUints[7];

Keys[17] = k. KeyUints[6];

Keys[18] = k. KeyUints[5];

Keys[19] = k. KeyUints[4];

Keys[20] = k. KeyUints[3];

Keys[21] = k. KeyUints[2];

Keys[22] = k. KeyUints[1];

Keys[23] = k. KeyUints[0];

Keys[24] = k. KeyUints[7];

Keys[25] = k. KeyUints[6];

Keys[26] = k. KeyUints[5];

Keys[27] = k. KeyUints[4];

Keys[28] = k. KeyUints[3];

Keys[29] = k. KeyUints[2];

Keys[30] = k. KeyUints[1];

Keys[31] = k. KeyUints[0];

}

}

БтатичСский класс GostEncoder — ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° для Π½Π°ΡˆΠΈΡ… классов энкодСра ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π°:

public static class GostEncoder

{

private static byte[] resultBytes;

public static byte[] Encode (string line, string key)

{

BytesChopper chopper = new BytesChopper (line);

Encoder encoder = new Encoder (key);

int i, count = chopper. BlocksCount;

resultBytes = new byte[count * 8];

byte[] innerBytes;

for (i = 0; i < count; i++)

{

innerBytes = chopper. Get (i);

encoder.Process (innerBytes);

byte[] encodedbytes = GetEncodedBytes (encoder);

AddToResult (encodedbytes, i);

}

return resultBytes;

}

static void AddToResult (byte[] bytes, int chunkNumber)

{

int i, count = bytes. Length;

for (i = 0; i < count; i++)

{

resultBytes[chunkNumber*8 + i] = bytes[i];

}

}

static byte[] GetEncodedBytes (EncryptionTemplateMethod encoderdecoder)

{

byte[] N0 = MathBlock. UintToByteArray (BitWorker.Reverse (encoderdecoder.State[0]));

byte[] N1 = MathBlock. UintToByteArray (BitWorker.Reverse (encoderdecoder.State[1]));

byte[] resultBytes = new byte[8];

int i;

for (i = 0; i < 4; i++)

{

resultBytes[i] = N0[i];

resultBytes[4 + i] = N1[i];

}

return resultBytes;

}

public static string Decode (byte[] encryptedBytes, string key)

{

BytesChopper chopper = new BytesChopper (encryptedBytes);

Decoder decoder = new Decoder (key);

int i, count = chopper. BlocksCount;

resultBytes = new byte[count * 8];

byte[] innerBytes;

for (i = 0; i < count; i++)

{

innerBytes = chopper. Get (i);

decoder.Process (innerBytes);

byte[] encodedBytes = GetEncodedBytes (decoder);

AddToResult (encodedBytes, i);

}

return Encoding.Default.GetString (resultBytes);

}

}

Класс тСстов:

[TestClass]

public class UnitTest1

{

[TestMethod]

public void BytesChopperTest ()

{

byte[] buf = { 100, 100, 200, 200, 100, 100, 200, 200, 100, 100, 200, 200, 100, 100, 200, 200 };

BytesChopper chopper = new BytesChopper (buf);

Assert.AreEqual (chopper.BlocksCount, Math. Ceiling ((double) buf. Count ()/8));

foreach (var b in chopper. Get (0))

{

Debug.WriteLine (b);

}

foreach (var b in chopper. Get (1))

{

Debug.WriteLine (b);

}

}

[TestMethod]

public void BytesChopperExceptionTest ()

{

byte[] buf = { 100, 100, 200, 200, 100, 100, 200, 200, 100, 100, 200, 200, 100, 100, 200};

try

{

BytesChopper chopper = new BytesChopper (buf);

}

catch (Exception e)

{

Assert.AreEqual (e.GetType (), typeof (ArgumentException));

}

}

[TestMethod]

public void FromHex ()

{

string[] stringsBuffer = { «AAFF», «FFA», «0FFA», «FFA0» };

foreach (string line in stringsBuffer)

{

byte[] bytes = MathBlock. FromHex (line);

for (int i = 0; i < bytes. Length; i++)

{

Debug.Write (bytes[i]+ ««);

}

Debug.Write («n»);

}

}

[TestMethod]

public void ToHex ()

{

byte[] A = { 100, 100, 200, 200};

byte[] B = { 100, 200, 200 };

byte[] C = { 0, 100, 200, 200 };

Debug.WriteLine (MathBlock.ToHex (A));

Debug.WriteLine (MathBlock.ToHex (B));

Debug.WriteLine (MathBlock.ToHex (C));

}

[TestMethod]

public void Xor ()

{

uint A = uint. MaxValue;

uint B = uint. MaxValue;

uint C = uint. MaxValue/2;

Debug.WriteLine (A);

Debug.WriteLine (MathBlock.Xor (A, B));

Debug.WriteLine (MathBlock.Xor (A, C));

Debug.WriteLine (MathBlock.Xor (B, C));

Assert.AreEqual ((uint)173, MathBlock. Xor (101, 200));

}

[TestMethod]

public void AddMod ()

{

Assert.AreEqual (MathBlock.AddMod (120, 200, 5), (uint)0);

Assert.AreEqual (MathBlock.AddMod (400, 240, 6), (uint)0);

Assert.AreEqual (MathBlock.AddMod (400, 241, 6), (uint)1);

}

[TestMethod]

public void ShiftLeft ()

{

Assert.AreEqual (MathBlock.ShiftLeft ((byte)10, 2), (uint)40);

Assert.AreEqual (MathBlock.ShiftLeft (uint.MaxValue / 2, 1), (uint.MaxValue/ 2) * 2);

}

[TestMethod]

public void RotateLeft ()

{

Assert.AreEqual (MathBlock.RotateLeft (MathBlock.ShiftLeft ((uint)1, 31), 1), (uint)1);

Assert.AreEqual (MathBlock.RotateLeft (MathBlock.ShiftLeft ((uint)1, 31)+1, 1), (uint)3);

Assert.AreEqual (MathBlock.RotateLeft ((byte)MathBlock.ShiftLeft ((byte)1, 7), 1), (byte)1);

Assert.AreEqual (MathBlock.RotateLeft ((byte)129, 1), (byte)3);

}

[TestMethod]

public void FourBytesToUint ()

{

Assert.AreEqual (MathBlock.FourBytesToUint (1, 1, 1, 1), (uint)16843009);

Assert.AreEqual (MathBlock.FourBytesToUint (3, 3, 3, 3), (uint)50529027);

Assert.AreEqual (MathBlock.FourBytesToUint (170, 170, 170, 170), (uint)2863311530);

}

[TestMethod]

public void FourBytesReverse ()

{

uint buffer = BitWorker. Reverse (MathBlock.FourBytesToUint (170, 171, 172, 173));

uint mustBe = MathBlock. FourBytesToUint (BitWorker.Reverse (173), BitWorker. Reverse (172),

BitWorker.Reverse (171), BitWorker. Reverse (170));

Assert.AreEqual (buffer, mustBe);

}

[TestMethod]

public void UintToByteArray ()

{

byte[] arrayBytes = {170, 170, 170, 170};

Assert.AreEqual (MathBlock.UintToByteArray (2 863 311 530)[0], arrayBytes[0]);

Assert.AreEqual (MathBlock.UintToByteArray (2 863 311 530)[1], arrayBytes[1]);

Assert.AreEqual (MathBlock.UintToByteArray (2 863 311 530)[2], arrayBytes[2]);

Assert.AreEqual (MathBlock.UintToByteArray (2 863 311 530)[3], arrayBytes[3]);

Assert.AreEqual (MathBlock.UintToByteArray (2 863 311 530).Length, arrayBytes. Length);

byte[] arrayBytes1 = { 1, 1, 1, 1 };

Assert.AreEqual (MathBlock.UintToByteArray (16 843 009)[0], arrayBytes1[0]);

Assert.AreEqual (MathBlock.UintToByteArray (16 843 009)[1], arrayBytes1[1]);

Assert.AreEqual (MathBlock.UintToByteArray (16 843 009)[2], arrayBytes1[2]);

Assert.AreEqual (MathBlock.UintToByteArray (16 843 009)[3], arrayBytes1[3]);

Assert.AreEqual (MathBlock.UintToByteArray (16 843 009).Length, arrayBytes1. Length);

}

[TestMethod]

public void GetBitSetBit ()

{

Assert.AreEqual (BitWorker.GetBit (1, 0), BitWorker. GetBit ((uint) 1 000 000 001, 0));

Assert.AreEqual (BitWorker.SetBit (1, 1, true), 3);

Assert.AreEqual (BitWorker.SetBit (1 000 000 001, 1, true), (uint) 1 000 000 003);

}

[TestMethod]

public void Reverse ()

{

Assert.AreEqual (BitWorker.Reverse (128), (byte)1);

Assert.AreEqual (BitWorker.Reverse (2 147 483 648), (uint)1);

}

[TestMethod]

public void KeyTest ()

{

Key key0 = new Key («AABBAAFFAACCAADDAABBAADD AACCAAFFaabbaaffaaccaaddaabbaaddaaccaaff»);

Key key1 = new Key («aabbaaffaaccaaddaabbaaddaaccaaff AABBAAFFAACCAADDAABBAA DDAACCAAFF»);

for (int i = 0; i < 8; i++)

{

Assert.AreEqual (key0.KeyUints[i], key1. KeyUints[i]);

Debug.WriteLine (key0.KeyUints[i]);

}

}

[TestMethod]

public void EncoderTest ()

{

string testKey = «AABBAAFFAACCAADDAABBAADDAACCAAFF aabbaaffaaccaaddaabbaaddaaccaaff» ;

string testData = «asdasdas» ;

byte[] testBytes = GostEncoder. Encode (testData, testKey);

foreach (var testByte in testBytes)

{

Debug.Write (testByte + ««);

}

Debug.Write («n»);

string testString = GostEncoder. Decode (testBytes, testKey);

Debug.Write (testString);

Assert.AreEqual (testData, testString);

}

[TestMethod]

public void EncoderTest2()

{

string testKey = «4 674 567 457 4747aff43353453454568F0012323534 5 474 846 645 645 645 709 312» ;

string testData = «BLABLABL» ;

byte[] testBytes = GostEncoder. Encode (testData, testKey);

foreach (var testByte in testBytes)

{

Debug.Write (testByte + ««);

}

Debug.Write («n»);

string testString = GostEncoder. Decode (testBytes, testKey);

Debug.Write (testString);

Assert.AreEqual (testData, testString);

}

[TestMethod]

public void EncoderTest3()

{

string testKey = «4 674 567 457 4747aff43353453454568F0012323 5 345 474 846 645 645 761 052 672» ;

string testData = «Hello World! xDxD» ;

byte[] testBytes = GostEncoder. Encode (testData, testKey);

foreach (var testByte in testBytes)

{

Debug.Write (testByte + ««);

}

Debug.Write («n»);

string testString = GostEncoder. Decode (testBytes, testKey);

Debug.Write (testString);

Assert.AreEqual (testData, testString);

}

[TestMethod]

public void EncoderShortTest ()

{

string testKey = «AABBAAFFAACCAADDAABBAADDAACCAAFF aabbaaffaaccaaddaabbaaddaaccaaff» ;

string testData = «asda» ;

try

{

byte[] testBytes = GostEncoder. Encode (testData, testKey);

}

catch (Exception e)

{

Assert.AreEqual (e.GetType (), typeof (ArgumentException));

}

}

[TestMethod]

public void EncoderBigTest ()

{

string testKey = «AABBAAFFAACCAADDAABBAADDAACCAAFF aabbaaffaaccaaddaabbaaddaaccaaff» ;

string testData = «asdasdasdasdasdasdasdasd» ;

byte[] testBytes = GostEncoder. Encode (testData, testKey);

foreach (var testByte in testBytes)

{

Debug.Write (testByte+" «);

}

string testString = GostEncoder. Decode (testBytes, testKey);

Debug.Write («n»);

Debug.WriteLine (testData+" n");

Debug.WriteLine (testString);

Assert.AreEqual (testData, testString);

}

[TestMethod]

public void EncoderBigNotFullTest ()

{

string testKey = «AABBAAFFAACCAADDAABBAADDAACCAAFF aabbaaffaaccaaddaabbaaddaaccaaff» ;

string testData = «asdasdasdasdasdasdasd» ;

try

{

byte[] testBytes = GostEncoder. Encode (testData, testKey);

}

catch (Exception e)

{

Assert.AreEqual (e.GetType (), typeof (ArgumentException));

}

}

}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ TDD Π½Π° C# ΠΏΠΎΠ΄ Visual Studio 2012.

Π‘Ρ‚Ρ€ΠΎΠΊΠ° «asdasdas»:

Π‘Ρ‚Ρ€ΠΎΠΊΠ° «Hello world! xDxD»

Анализ покрытия ΠΊΠΎΠ΄Π° тСстами (Π½Π΅ ΠΏΡ€ΠΎΡ‚Сстированы Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи):

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ