Кафедра: АСОІ
Лабораторна робота
«Алгоритм формування ключів в процесі функціонування DES»
з дисципліни
«Методи та засоби захисту інформації»
Москва 2009
Зміст
Технічне завдання
Алгоритм формування ключів в процесі функціонування DES.
Робота алгоритму
1 крок. Перестановки бітів ключа з використанням таблиці перестановок.
2 крок. Розбиття ключа.
3 крок. Створення 16-ти підключений шляхом зсуву.
4 крок. Перестановка бітів ключа з використанням таблиці PC1.
Вихідний код
Приклад роботи програми
Технічне завдання
Реалізувати алгоритм формування ключів в процесі функціонування DES на мові програмування C + +.
Провести тест програми.
Алгоритм формування ключів в процесі функціонування DES
Формування ключів - алгоритм, що дозволяє отримати за відносно коротким ключу шифрування послідовність раундових ключів.
Вхідні дані: Ключ складається з 8 символів або 8 байт. Відповідно ключ має розмір 64 байта. Але розмір ключа використовується тільки для запису (для організації даних). Фактично, кожен 8 біт відкидається і ефективний розмір ключа - 56 біт.
Робота алгоритму
1 крок. Перестановки бітів ключа з використанням таблиці перестановок.
Для прикладу введемо:
olga 1234
Поставлене ключ у двійковому представленні:
На початку над ключем шифру виконується операція B, яка зводиться до вибору певних біт та їх перестановці, як це показано в таблиці. Причому, перші чотири рядки визначають, як вибираються біти послідовності C (0) (перший бітом C (0) буде битий 57 біт ключа шифру, потім біт 49 і т.д., а останніми бітами біти 44 і 36 ключа шифру), а наступні чотири рядки - як вибираються біти послідовності D (0) (тобто послідовність D (0) будемо складатися з бітів 63,55, ..., 12, 4 ключа шифру).
57 | 49 | 41 | 33 | 25 | 17 | 9 |
1 | 58 | 50 | 42 | 34 | 26 | 18 |
10 | 2 | 59 | 51 | 43 | 35 | 27 |
19 | 11 | 3 | 60 | 52 | 44 | 36 |
63 | 55 | 47 | 39 | 31 | 23 | 15 |
7 | 62 | 54 | 46 | 38 | 30 | 22 |
14 | 6 | 61 | 53 | 45 | 37 | 29 |
21 | 13 | 5 | 28 | 20 | 12 | 4 |
У результаті перестановки ключ буде виглядати так:
2 крок. Розбиття ключа
На цьому кроці здійснюється розбиття ключа на 2 половини C 0 і D 0. Кожна половина містить 28 біт.
C 0:
0000111111111111111100000000
D 0:
0101110101100101100001110011
3 крок. Створення 16-ти підключений шляхом зсуву
Після визначення C (0) і D (0) рекурсивно визначаються C (i) і D (i), i = 1,2, ..., 16. Для цього застосовуються операції зсуву вліво на один або два біти в залежності від номера кроку ітерації, як це показано в таблиці «Функція зсуву Si». Операції зсуву виконуються для послідовностей C (i) і D (i) незалежно. Наприклад, послідовність C (3) виходить, за допомогою зсуву вліво на дві позиції послідовності C (2), а послідовність D (3) - за допомогою зсуву вліво на дві позиції послідовності D (2). Слід мати на увазі, що виконується циклічний зсув вліво. Наприклад, одиничний зрушення вліво послідовності C (i) призведе до того, що перший біт C (i) стане останнім і послідовність біт буде наступна: 2,3, ..., 28,1.
Таблиця «Функція зсуву Si»
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 2 |
6 | 2 |
7 | 2 |
8 | 2 |
9 | 1 |
10 | 2 |
11 | 2 |
12 | 2 |
13 | 2 |
14 | 2 |
15 | 2 |
16 | 1 |
У результаті зсуву отримуємо наступні пари
Кількість зрушень | Створені пари |
1 | C 1: 0001111111111111111000000000 D 1: 1011101011001011000011100110 |
1 | C 2: 0011111111111111110000000000 D 2: 0111010110010110000111001101 |
2 | C 3: 1111111111111111000000000011 D 3: 1101011001011000011100110111 |
2 | C 4: 1111111111111100000000001111 D 4: 0101100101100001110011011101 |
2 | C 5: 1111111111110000000000111111 D 5: 0110010110000111001101110101 |
2 | C 6: 1111111111000000000011111111 D 6: 1001011000011100110111010110 |
2 | C 7: 1111111100000000001111111111 D 7: 0101100001110011011101011001 |
2 | C 8: 1111110000000000111111111111 D 8: 0110000111001101110101100101 |
1 | C 9: 1111100000000001111111111111 D 9: 1100001110011011101011001011 |
2 | C 10: 1110000000000111111111111111 D 10: 0000111001101110101100101100 |
2 | C 11: 1000000000011111111111111110 D 11: 0011100110111010110010110000 |
2 | C 12: 0000000001111111111111111000 D 12: 1110011011101011001011000011 |
2 | C 13: 0000000111111111111111100000 D 13: 1001101110101100101100001110 |
2 | C 14: 0000011111111111111110000000 D 14: 0110111010110010110000111001 |
2 | C 15: 0001111111111111111000000000 |
D 15: 1011101011001011000011100110 | |
1 | C 16: 0011111111111111110000000000 D 16: 0111010110010110000111001101 |
4 крок. Перестановка бітів ключа з використанням таблиці PC 1
До фінальної перестановки бітів ключів, необхідне злиття кожної пари даних. Після того, як для кожного бітового блоку C n D n, де 1 <= n <= 16 здійснитися відповідна перестановка з таблиці (див. нижче), формуючи ключі. Тільки 48 біт кожної об'єднаної пари зберігається в перестановленном ключі.
14 | 17 | 11 | 24 | 1 | 5 |
3 | 28 | 15 | 6 | 21 | 10 |
23 | 19 | 12 | 4 | 26 | 8 |
16 | 7 | 27 | 20 | 13 | 2 |
41 | 52 | 31 | 37 | 47 | 55 |
30 | 40 | 51 | 45 | 33 | 48 |
44 | 49 | 39 | 56 | 34 | 53 |
46 | 42 | 50 | 36 | 29 | 32 |
Всі підключи:
K 1: 111001111101001101110010001100110001010011011101
K 2: 111001101101001101110011111011100011011001010110
K 3: 101011111101001111011011001111011110001011101010
K 4: 001111100101001111011011011101001101110001000011
K 5: 001111100101100111011001100011101010010001111110
K 6: 000111110110100111011101101010011111111011000000
K 7: 000111100110110110011101011111001100011000110011
K 8: 010111100010110110101101100111110100110001001110
K 9: 010110111010110110101101010001010001111010110110
K 10: 110110001010110010101111110110010010100011111001
K 11: 111100001010111010100110001000111101101000011101
K 12: 111100011011111000100110000101110011010010110110
K 13: 111000011011011001110110111010010000100011100101
K 14: 111001001101011001110110010001101110101010011111
K 15: 111001111101001101110010001100110001010011011101
K 16: 111001101101001101110011111011100011011001010110
Вихідний код
# Include <stdio.h>
# Include <math.h>
# Include <string.h>
# Include <stdlib.h>
int main (int argc, char * argv []) {
int
i, b, y, r, j, v, p, m, l, f, u, k, a, s, q, D [100] [100], Y [100] [100], U [100] [100], X [1000] [1000], E [100] [100], G [100] [100], W [100] [100], P [100] [1 $
double z;
int key [16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
char A [1000];
char B [200];
char N [200];
char T [200];
char C [1000];
char Z [43];
char R [43];
char L [43];
char * str2;
char * str;
char * str1;
char * str3;
char * str4;
char * str5;
char d [100];
printf ("\ nVvedite key \ n");
<