Professional Documents
Culture Documents
Теплоенергетичний факультет
Кафедра АПЕПС
КУРСОВА РОБОТА
з дисципліни «Алгоритмізація та програмування – 2: Процедурне
програмування»
На тему:
«Програмна система для шифрування даних методом бітового зсуву
Київ - 2021
Анотація
Annotation
2
Київський політехнічний інститут імені Ігоря Сікорського
Теплоенергетичний факультет
ЗАТВЕРДЖУЮ
В.о. зав. кафедри АПЕПС
ЗАВДАННЯ
на курсову роботу студента
1. Тема роботи:
Програмна система для шифрування даних методом Бітового Зсуву.
КАЛЕНДАРНИЙ ПЛАН
Студент: ____________
(підпис)
ЗМІСТ
ВСТУП 6
1. Бітові операції 11
5
2. Опис проектного рішення шифрування методом бітового зсуву 15
3.2 Тестування ПЗ 19
Висновки 22
Додаток А 24
6
ВСТУП
7
потім її можна буде використовувати для нанесення неймовірного шкоди всім
нам.
У минулі часи
Класично криптографія використовувала «безпеку за допомогою
невідомості» як спосіб зберегти передану інформацію в безпеці. У цих випадках
застосовується метод тримався в секреті від усіх, крім небагатьох, звідси і термін
«невідомість» .Це зробило спілкування безпечним, але реалізувати його в
широкому масштабі було непросто. Класичні криптографічні методи безпечні
тільки тоді, коли дві сторони можуть спілкуватися в безпечної екосистемі.
Малюнок 1.
На малюнку 1 ми показуємо класичну криптографічний систему.
Відправник і одержувач спочатку узгоджують набір загальних ключів
8
шифрування / дешифрування. Ці ключі потім використовуються послідовно для
шифрування і розшифровки кожного наступного повідомлення.
Але ...
9
Малюнок 2
10
Ідентифікація та аутентифікація: перед обміном будь-якою інформацією
необхідно ідентифікувати і потім авторизувати відправника і одержувача.
Цілісність: інформація не повинна змінюватися при зберіганні або
транспортуванні. Будь-яка модифікація повинна бути виявленої.
Фіксація авторства: неможливо відмовитися від створення / передачі
повідомлення. Це забезпечує «цифрову» легітимність і відстеження транзакції.
Сучасні криптографічні системи надають все вищеперелічене або їх комбінацію
в різних формах для передбачуваного додатку. Давайте докладніше розглянемо
кожну з цих цілей, щоб отримати загальне уявлення про те, як вони досягаються.
11
1. Бітові Операції
Малюнок 3
Бітові оператори І, АБО, НЕ використовують ту ж таблицю істинності, що і
їх логічні еквіваленти, за тим винятком, що вони працюють побитно. Що
виключає Або має наступну таблицю істинності:
Малюнок 4
char ch;
13
Оператори зсуву >> і << зрушують біти в змінної вправо і вліво на вказане
число. Загальний вигляд оператора зсуву вправо:
Операції бітового зсуву можуть бути корисні при декодуванні інформації від
зовнішніх пристроїв і для читання інформації про статус. Оператори бітового
зсуву можуть також використовуватися для виконання швидкого множення і
ділення цілих чисел. Зрушення вліво рівносильний множенню на 2, а зрушення
вправо - поділу на 2, як показано в таблиці.
Малюнок 5
14
Оператор доповнення, ~, інвертує стан кожного біта зазначеної змінної, тобто
1 встановлюється в 0, а 0 - в 1.
Малюнок 6
15
2. Опис проектного рішення шифрування методом бітового зсуву
Зсув може бути вліво або вправо. Кругова операція лівого зсуву зрушує
кожен біт в n -бітовом слові на k позиції вліво; крайні ліві k -біти видаляються
зліва і стають самими правими битами. Кругова операція правого зсуву зрушує
кожен біт в n -бітовом слові на k позицій вправо; найправіші k -біти справа
видаляються і стають крайніми лівими битами. Малюнок 7 показує і ліві і праві
операції в разі, де n = 8 і k = 3 .
16
циклічна операція зсуву змішує біти в слові і допомагає приховати зразки в
первісному слові. Хоча число позицій, на які біти будуть зрушені, може
використовуватися як ключ, циклічнаоперація зсуву зазвичай - без ключа;
значення k встановлюється і задається заздалегідь.
Властивості .Операція циклічного зсуву має дві властивості, які нам треба
знати.
Малюнок 7
Заміна
17
Малюнок 8
18
Мова програмування С використовує бібліотеки, як основний засіб свого
розширення. У С, бібліотека — набір функцій, котрі містяться в одному файлі.
Кожна бібліотека зазвичай має заголовний файл, в якому містяться прототипи
функцій, присутніх у бібліотеці, а також декларації спеціальних типів даних і
макро-символів, що використовують ці функції. Для того, щоб програма
використовувала бібліотеку, заголовний файл цієї бібліотеки має бути
оголошений вгорі файлу із сирцевим кодом, і бібліотека має бути злінкованою з
програмою, що у багатьох випадках вимагає спеціальної опції для компілятора
(наприклад, -lmath).
Відтоді, як С набула великої популярності, для неї було написано чимало інших
бібліотек. Бібліотеки часто пишуться на С, оскільки компілятори C генерують
ефективний об'єктний код; пізніше програмісти створюють інтерфейси до
бібліотек таким чином, що ті можуть використовуватися високорівневими
мовами, на кшталт Java, Perl та Python.
19
3. Налагоджування та тестування системи, огляд результатів
3.2 Тестування ПЗ
Малюнок 9
Малюнок 10
21
Висновки
22
Перелік використаних джерел
23
Додаток А
int main(void)
{
char *men[] = {"1. New", "2. Find", "3. To Head", "4. To Tail", "5.
Next", "6. Previous", "7. Show", "8. List", "9. Insert", "10. Delete",
"11. Count", "12. Exit"};
int i = 0;
struct list *current = NULL;
while(1) //while of we not select "exit" button
{
if(!current)
printf("You not have any element, create one!\n");
else
printf("Now you on element #%d\n", current->number);
i = menu(men);
switch (i) // switch to menu row if is has or do nothing if is missed
{
case 1:
current = menuNew(current);
break;
case 2:
current = menuFind(current);
break;
case 3:
current = menuToHead(current);
24
break;
case 4:
current = menuToTail(current);
break;
case 5:
current = menuNext(current);
break;
case 6:
current = menuPrevious(current);
break;
case 7:
menuShow(current);
break;
case 8:
menuList(current);
break;
case 9:
current = menuInsert(current);
break;
case 10:
current = menuDelete(current);
break;
case 11:
menuCount(current);
break;
case 12:
menuExit();
break;
default:
break;
}
}
}
*/
25
struct list* menuToHead(struct list *arr);
struct data
{
char lastName[32];
char firstName[32];
char midleName[32];
char group[32];
char mobile[32];
unsigned short math;
unsigned short physic;
unsigned short english;
unsigned short literature;
};
struct list
{
struct data *d;
int number;
struct list *next;
struct list *prev;
};
26
printf("Input Last Name:");
scanf("%31s", data->lastName);
printf("Input First Name:");
scanf("%31s", data->firstName);
printf("Input Father Name:");
scanf("%31s", data->midleName);
printf("Input Group:");
scanf("%31s", data->group);
printf("Input Mobile:");
scanf("%31s", data->mobile);
printf("Input Math:");
scanf("%hu", &data->math);
printf("Input Physic:");
scanf("%hu", &data->physic);
printf("Input Englis:");
scanf("%hu", &data->english);
printf("Input Literature:");
scanf("%hu", &data->literature);
if (!arr)
{
arr = (struct list *)malloc(sizeof(struct list));
arr->next = NULL;
arr->prev = NULL;
arr->d = data;
arr->number = 0;
return arr;
}
else
{
struct list *buf = menuToHead(arr);
int k = 0;
for (;buf->next; buf->next = buf->next->next){k++;}
buf->next = (struct list *)malloc(sizeof(struct list));
buf->next->next = NULL;
buf->next->number = k;
buf->next->prev = buf;
buf->next->d = data;
return buf->next;
}
}
void printFindMenu()
{
27
printf("insert number find key\n");
printf("1. LastName\n");
printf("2. FirstName\n");
printf("3. MidleName\n");
printf("4. Group\n");
printf("5. Mobile\n");
printf("6. Math\n");
printf("7. Physic\n");
printf("8. English\n");
printf("9. Literature\n");
}
28
}
break;
case 7 :
if (data->physic == num)
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
case 8 :
if (data->english == num)
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
case 9 :
if (data->literature == num)
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
}
}
}
else
{
char word[32];
printf("Input key: ");
scanf("%31s", word);
arr = menuToHead(arr);
struct data* data;
for(;arr;arr = arr->next)
{
data = (struct data*)arr->d;
switch (key)
{
case 1 :
if (!strcmp(word, data->lastName))
{
printf("Search success element %d\n", arr->number);
29
return arr;
}
break;
case 2 :
if (!strcmp(word, data->firstName))
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
case 3 :
if (!strcmp(word, data->midleName))
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
case 4 :
if (!strcmp(word, data->group))
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
case 5 :
if (!strcmp(word, data->mobile))
{
printf("Search success element %d\n", arr->number);
return arr;
}
break;
}
}
}
printf("Not Found\n");
return buf;
}
30
{
printf("Error list not found 404\n");
return NULL;
}
for (;arr->prev; arr = arr->prev){}
return arr;
}
31
}
struct data *data = (struct data*)arr->d;
printf("\nElement number %d:\n", arr->number);
printf("Last name: %s\n",data->lastName);
printf("First name: %s\n",data->firstName);
printf("Midle name: %s\n",data->midleName);
printf("Group: %s\n",data->group);
printf("Mobile: %s\n",data->mobile);
printf("Math: %d\n",data->math);
printf("Physic: %d\n",data->physic);
printf("English: %d\n",data->english);
printf("Literature: %d\n",data->literature);
}
void menuExit()
{
exit(0);
}
32
arr->next = NULL;
arr = menuNew(arr);
arr->next = buf;
for(;buf; buf = buf->next)
{
buf->number--;
}
}
else
{
arr = menuNew(arr);
}
return arr;
}
next = arr->next;
prev= arr->prev;
buf = arr;
if(prev)
{
prev->next = next;
arr = prev;
}
if(next)
{
next->prev = prev;
arr = next;
}
free(buf->d);
free(buf);
for(;next; next = next->next)
{
next->number--;
33
}
return arr;
}
34
int main(void)
{
char *a;
int key;
a = (char*)malloc(sizeof(char) * 64);
printf("Input your text:");
scanf("%s",a);
printf("Input your number key to crypt: ");
scanf("%d",&key);
crypt(a, key);
printf("crypted text :%s\n",a);
printf("Input your number key to encrypt: ");
scanf("%d",&key);
encrypt(a, key);
printf("encrypted text:%s\n",a);
}
35