Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labu_4_KYRS.doc
Скачиваний:
17
Добавлен:
02.05.2019
Размер:
2 Мб
Скачать
☆

Циклічний зсув

Циклічний зсув вліво на 3 розряди 8-бітної шини

Можна показати, що циклічний зсув є частиною P-блоку.

У найпростішому випадку (зсув на 1 біт), крайній біт переміщається на інший кінець регістра або шини. Залежно від того який біт береться, правий або лівий, зсув називається вправо або вліво. Зсув на більше число біт можна розглядати, як багаторазове застосування зсуву на 1.

Циклічний зсув на m біт для n-розрядного входу (m < n)

Напрямок зсуву

Порядок проходження бітів до зсуву

Порядок проходження битов після зсуву

вліво

b0,b1,b2,...,bn − 1

bm,bm + 1,...bn − 1,b0,b1,...,bm − 1

вправо

b0,b1,b2,...,bn − 1

bn − m,bn − m + 1,...bn − 1,b0,b1,...,bn − m − 1

Додавання по модулю n

Позначення операції — (A + B) mod n — це залишок від розподілу суми A + B на n, де A й B — складають числа, що.

Можна показати, що додавання двох чисел по модулі n представляється у двійковій системі числення, як S-блок, у якого на вхід подається число A, а як система комутації S-блоку використається циклічний зсув вліво на B розрядів.

В комп'ютерній техніці й електроніці операція додавання, як правило, реалізована як додавання по модулі n = 2m, де m — ціле (звичайно m дорівнює розрядності машини). Для одержання у двійковій системі A + B mod 2m досить скласти числа, після чого відкинути розряди починаючи з m-того й старше.

Множення по модулю n

Позначення операції — (A * B) mod n — це залишок від розподілу добутку A * B на n, де A й B — перемножують числа, що.

У персональних комп'ютерах на платформі x86 при перемножуванні двох розрядн-m-розрядних чисел виходить число розрядністю 2*m. Щоб одержати залишок від розподілу на 2m потрібно відкинути m старших біт.

Приклад реалізації мовою Си

Загальний вид алгоритму шифрування, що використає мережу Фейстеля:

/* функція перетворення подблока по ключі (залежить від конкретного алгоритму)

subblock - преутворений подблок

key - ключ

значення, що повертається - перетворений блок*/

int f(int subblock, int key);

/*Шифрування відкритого тексту

left - лівий вхідний подблок

right - правий вхідний подблок

* key - масив ключів (по ключі на раунд)

rounds - кількість раундів*/

void crypt(int *left, int *right, int rounds, int *key)

{

int i, temp;

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

{

temp = *right ^ f(*left, key[i]);

*right = *left;

*left = temp;

}

}

/*Розшифрування тексту

left - лівий зашифрований підблок

right - правий зашифрований підблок*/

void decrypt(int *left, int *right, int rounds, int *key)

{

int i, temp;

for(i = rounds - 1; i >= 0; i--)

{

temp = *left ^ f(*right, key[i]);

*left = *right;

*right = temp;

}

}

Переваги й недоліки

Переваги:

  • Простота апаратної реалізації на сучасній елементній базі

  • Простота програмної реалізації в силу того, що значна частина функцій підтримується на апаратному рівні в сучасних комп'ютерах (наприклад, додавання по модулю 2 додавання по модулю 2n, множення по модулю 2n, і т.д.)

  • Гарна вивченість алгоритмів на основі мереж Фейстеля[5]

Недоліки:

  • За один раунд шифрується тільки половина вхідного блоку

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]