Курсовая работа (т): Розробка проекту програмного дешифратора алгоритмічною мовою високого рівня

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

 

Мал. 3

Кожному лінійному рекурентному регістру довжиною n розрядів можна зіставити поліном зворотних зв'язків h(x) з двійковими коефіцієнтами.

Якщо поліном h(x) - примітивний, то довжина послідовності, ЛРР, що генерується, максимальна. Така послідовність називається послідовністю максимальної довжини для зсувного регістра (Maximal Length Shift Register Sequence - MLSRS). Пітерсон і Уелдон показали, що при будь-якому цілому існує n-бітування послідовність MLSRS з періодом. Зокрема, послідовність матиме період і не повториться декілька років при передачі її по лінії зв'язку із швидкістю 1Мбит/с.

Слід зазначити, що для MLSRS, по-перше, розподіл "1" і "0" близько до рівномірного, наскільки це можливо при проходженні повного циклу (кількість "0" відрізняється від "1" на 1) . По-друге, якщо розглянути в одному циклі серії послідовних бітів, то половина серій з "1" довжину 1 ј серій - довжину 2,1/8 - довжину 3 і так далі Ця властивість розповсюджується на серії з "0",с обліком пропущеного. Це говорить про те, що вірогідність появи "1" і "0" не залежить від результату попереднього досвіду. І, по-третє, якщо послідовність повного циклу порівняти з цією ж послідовністю, але циклічно зрушеною на будь-яке число бітів (не рівне нулю або довжині До), то число не спів падань буде на одиницю більше, ніж число збігів. Всі ці властивості послідовності максимальної довжини свідчать про рівномірність розподілу випадкових чисел в цих послідовностях.

3.      Вимоги до програмного продукту

Вимоги розроблені відповідно до п. 20 статті 8 Закону України "Про державне регулювання ринку цінних паперів в Україні", з урахуванням існуючих міжнародних стандартів ISO 9000, ISO 9001, ISO 15022 та державних стандартів України класу 35.80 "Розроблення програмного забезпечення і системна документація".

Ці вимоги поширюються на програмні продукти, які створюються або використовуються професійними учасниками ринку цінних паперів та інститутами спільного інвестування при здійсненні професійної діяльності та визначають вимоги до таких програмних продуктів (далі - програмні продукти). Вимоги розповсюджуються на всі програмні продукти, які використовуються для формування електронних форм подання до Державної комісії з цінних паперів та фондового ринку (далі - Комісія) адміністративних даних різних видів та іншої інформації.

Вимоги:

. Розробка програмного продукту, який призначено для використання на фондовому ринку України, створюється на підставі технічного завдання. Технічне завдання на розробку програмного продукту створюється відповідно до нормативного документа Комісії, яким урегульовані питання, програмна реалізація яких потрібна.

. Програмний продукт повинен бути створений на ліцензійному програмному забезпеченні (з використанням ліцензійних засобів розробника), якщо це передбачено чинним законодавством.

. Механізми захисту інформації, які містить програмний продукт, повинні реалізуватися відповідно до національних нормативно-правових актів захисту інформації або міжнародних стандартів.

Для правильного та якісного виконання курсової роботи потрібно перш за все скласти алгоритм. В нашому випадку це блок-схема програми дешифратора. Блок-схема складається також для пояснення структури програми. Кожен блок в схемі відповідає окремій дії у програмі. Для зручності в схемі використані слова з самого тексту програми. Блок-схема дешифратора у нашому випадку складається з 48 блоків.

Для використання програми необхідно виконати ряд вимог:

1. У папці, в якій міститься програма необхідна наявність файлу з зашифрованою інформацією;

. Ключ вводиться з клавіатури;

. Довжина ключа - 21 символ;      

. Після вводу ключа, потрібно вказати адресу файлу, звідки треба зчитати зашифровану інформацію, наприклад: 1.txt;

. Довжина імені файлу не більше 8 символів.

4.      Текст програми

#include<stdio.h> /*об’явлення бібліотек */i,k,n=0,p=7,bitu,bukva; /* об’явлення змінних */a,b,z,x,v,u,y; /* об’явлення змінних */char m[30],r,c[210],l[210],s[30],j; /* об’явлення масивів та j змінної */char ms,reg[21],key[21]; /* об’явлення масивів та ms змінної */() /* заголовок функції */

{FILE *fp1; /* об’явлення структури файлу */f1[8]; /* об’явлення масиву файлу */(); /* очищення екрану */("=================================");("\n Programma DEKODIROVANIA");("\n=================================\n\n");("\n Vedite key \n"); /* Введення ключа */("%s",key);("\n Vedite kolichectvo bukv \n"); /* Введення кількості букв */("%d",&bukva);("\n Vedite name zakodirovanogo file= "); /* Ввести ім’я закодованого файлу */("%s",f1); /* запис імені файлу */=bukva*7; /* множення кількості букв на сім */(i=0;i<21;i++) /* параметр циклу */

{reg[i]=key[i]; /* кожному елементу масиву reg відповідає кожний елемент масиву key */

}((fp1=fopen("f1.txt","r"))==NULL) /* умова правильності введеного ім’я файлу*/

{printf("\n Nevozmozhno open file \n");fin;} /* безумовний оператор */(i=0;i<bitu;i++) /* параметр циклу для всіх бітів повідомлення */

{fscanf(fp1,"%c",&c[i]); /* запис у пам’ять файлу */

}(k=0;k<bukva;k++) /* параметр циклу для кількості символів переданого повідомлення */

{m[k]=n; /* кожному елементу масиву m[k] дорівнює значенню n */[k]=p; /* кожному елементу масиву s[k] дорівнює значенню p */=n+7;=p+7;=(reg[2]+reg[5]+reg[7]+reg[13]+reg[20])%2; /* сумування по модулю два */(i=m[k];i<s[k];i++)

{l[i]=c[i]^reg[20]; /* кожному елементу масиву l[i] відповідає сумування по модулю два reg[20] з кожним елементом масиву c[i] */

}(l[m[k]]==1) a=64; else a=0; /* умова, якщо елемент масиву l[i] буде дорівнювати одиниці, то програма вибирає перше значення, а якщо не дорівнює одиниці, то друге */(l[m[k]+1]==1) b=32; else b=0;(l[m[k]+2]==1) z=16; else z=0;(l[m[k]+3]==1) x=8; else x=0;(l[m[k]+4]==1) v=4; else v=0;(l[m[k]+5]==1) u=2; else u=0;(l[m[k]+6]==1) y=1; else y=0;=a+b+z+x+v+u+y; /* сумування всіх вибраних програмою букв при заданих умовах */("%c",j); /* виведення на екран розшифрованого повідомлення /*(i=21;i>0;i--)

{reg[i]=reg[i-1]; /* зсув регістрів масиву на один вправо */=reg[0]; /* присвоєння змінній ms нульового регістру */

}

}:;(); /* закрити всі файли */(stdout); /*очистити буфер екрану*/(); /*затримка екрану*/

}

5.      Опис програми

атака шифрування криптографічний гамування

Дана програма призначена для криптографічного дешифрування повідомлення методом гамування за допомогою лінійного рекурентного регістру. Ця програма починається з директиви препроцесора #include, яка в свою чергу підключає заголовковий файл стандартної бібліотеки stdio.h . Далі ми об’явили чотири цілочисленні змінні i,k, bitu,bukva, які належать до типу int. Також ми визначили дві змінних n,p та присвоїли цим змінним початкові значення, а саме n=0 та p=7. У третьому рядку програми ми об’явили сім цілочисленних змінних a,b,z,x,v,u,y. У четвертому рядку ми об’явили дві беззнакові змінні r та j. Ці змінні належать до беззнакового символьного типу, займають лише 1 байт пам’яті. Також ми об’явили чотири масиви беззнакового типу. Два з них, а саме m[30] та s[30] складаються з тридцяти елементів. Інші c[210] та l[210] складаються з двісті десяти елементів. У п’ятому рядку програми ми об’явили три змінних беззнакового символьного типу, а саме ms, reg[21], key[21]. Останні двоє з них є масивами, які складаються з двадцяти одного елемента.

Далі починається робота самої програми. Головна функція програми має назву main(), слово main - заголовок функції. Сьомий рядок програми об’являє, що fp1 є показником на структуру FILE. Програма на мові С управляє кожним файлом з допомогою окремої структури FILE. У восьмому рядку програми ми об’явили масив символьного типу f1[8], який складається з восьми елементів. Далі ми використали функцію clrscr(). Ця функція дає змогу очистити екран після кожної компіляції програми. В 10, 11 та 12 рядку ми використали функцію printf з допомогою якої ми можемо вивести на кран те, що ми хочемо. В 13 рядку програми ми ввели словосполучення Vedite key. А в наступному рядку з допомогою функції scanf значення, введено користувачем, поміщується в комірку пам’яті, якій присвоєне ім’я f1. В 15, 16 рядку програми ми ввели kolichectvo bukv та записали їх у пам’ять змінної bukva. У 17, 18 рядку ми зробили ту ж саму операцію, що і в попередніх двох рядках тільки зі словосполученням Vedite name zakodirovanogo file. В 19 рядку програми ми змінній bitu присвоїли вираз bukva*7. В 20 рядку програми ми ввели оператор for, який включає в свої параметри три частини. Перша частина для встановлення початкового значення змінній. У нашому випадку i=0. Друга частина визначає умову при якій буде виконуватися тіло циклу. В нашій програмі i<21. Третя частина - це модифікатор, який визначає зміну значень змінних, що управляють циклом після кожного виконання тіла циклу. В нашій програмі i++. В 21 рядку проводиться почергове привласнення значень від масиву key[i] до масиву reg[i]. Ця операція буде виконуватися рівно 21 раз. 23 рядок відкриває файл "f1.txt" для читання ("r") і перевіряє успішність виконання даної операції. Якщо даний файл не вдалося відкрити, то програма припиняє свою роботу переходячи через безумовний оператор goto до мітки fin. В 26 рядку ми використали оператор for (початкове значення i=0, умова i<bitu та модифікатор i++). У наступному рядку використали функцію fscanf з допомогою якої можна зчитати записану інформацію з файлу. Функція fscanf - це аналог функції scanf, за виключенням того, що fscanf в якості аргументу передається показник файла, з якого зчитуються дані.

В 29 рядку програми ми знову використали оператор for (початкове значення k=0, умова k<bukva та модифікатор k++). В наступних двох рядках програми ми привласнили масивам m[k] та s[k] відповідні значення n та p.( n=0; p=7). В 32, 33 рядках ми використали такі операції (n=n+7; p=p+7). Значення n та p після виконання кожного циклу програми збільшується на сім (наприклад: коли k=29 n буде дорівнювати 203, а p - 210). Відповідно до значень n та p масиви m[k] та s[k] теж змінюють свої значення після виконання кожного циклу програми. В 34 рядку ми використали операцію додавання за модулем 2, а саме %2. Змінній ms ми привласнили суму відповідних регістрів (у нашому випадку це сума таких регістрів: reg[2]+reg[5]+reg[7]+reg[13]+reg[20]). В наступному рядку програми ми вставили ще один оператор for (початкове значення i=m[k], умова i<s[k] та модифікатор i++). Цей оператор for є вставленим у зовнішній оператор for, тобто ці оператори взаємодіють один з одним. Значення масивів m[k] та s[k] залежать від значень змінних n та p, які після кожного виконання циклу програми змінюють свої значення (масиви m[k] та s[k] змінять свої значення рівно 30 раз). В 36 рядку програми ми масиву l[i] присвоїли значення виразу c[i]^reg[20] (цей вираз означає додавання побітно, тобто іншими словами додавання за модулем два). З 38 по 44 рядок включно ми використали оператори умовної передачі управління (комбінацію вкладених конструкцій if - else - if). В наступному рядку програми ми присвоїли змінній j суму вибраних програмою змінних a+b+z+x+v+u+y (в залежності від умови програма вибирає ці змінні).

В 43 рядку програми ми виводимо вже розшифрований програмою текст надрукований відправником (після виконання кожного циклу програми виводиться на екран одна буква чи символ). Далі ми використали ще один оператор for - цей оператор є другим вставленим оператором for в загальний оператор for. Цей оператор вставлений в програму з метою щоб зсунути регістри на один розряд вправо після кожного виконання циклу програми (reg[i]=reg[i-1]). В 49 рядку програми змінній ms присвоюється значення нульового регістру (нульовий регістр змінюється після виконання кожного циклу програми). 52 рядок є завершенням виконання першого оператора for.

Функція fcloseall() символізує закриття всіх файлів. Функція fflush(stdout) дозволяє очистити буфер екрану, а з допомогою функції bioskey() відбувається затримка екрану.

Отже, в результаті виконання програми на екрані висвітиться розшифроване повідомлення, яке було надруковане відправником.

Висновки

При виконанні даного курсового проекту мною було закріплено та поглиблено знання з навчальної дисципліни "Алгоритмізація та програмування". Цей проект дозволяє оволодіти початковими криптографічними навиками та вдосконалити навики програмування на алгоритмічній мові високого рівня, познайомитись з криптографічними системами та їх різновидами. Під час підготовки даного проекту було відпрацьоване правильне оформлення технічної документації на програмні продукти.

Виконання цієї курсової роботи дає можливість познайомитися з криптографічною системою, в основу якої покладено застосування лінійно рекурентного регістру(ЛРР). В процесі написання курсової роботи було вивчено такі криптографічні системи, як синхронні та асинхронні. В даному проекті використовується синхронна криптографічна система в якій ключ шифрування дорівнює ключу дешифрування (Кш=Кдш). Цей аспект є надзвичайно важливим, адже неправильне введення ключа веде за собою неправильне розшифрування тексту. Симетричні системи найбільш стійкі до крипто аналізу, тому-що у цих системах використовуються один ключ, яким шифрується і дешифрується повідомлення. Ці системи ефективно зашифровують велику кількість даних, однак, вони висловлюють істотні ключові проблеми управління в мережах більше ніж у маленькому числі користувачів, і зазвичай використовуються разом з шифрування з відкритим ключем.

В процесі виконання даної курсової роботи ми познайомилися з таким методом шифрування як гамування. Гамування - це процес накладання за певним законом гами шифру на відкриті дані. Під гамою шифру розуміється псевдовипадкова двійкова послідовність, що виробляється за заданим алгоритмом для зашифровування відкритих даних і розшифрування зашифрованих даних. Гамування здійснюється на основі лінійно рекурентного регістру (ЛРР). Він будується на основі лінійних рекурентних співвідношень. Лінійний рекурентний регістр (ЛРР) є найбільш простим і поширеним генератором Псевдо Випадковій Двійковій Послідовності (ПСДП).

Вважаю, навички, здобуті під час роботи над даним проектом, знадобляться у подальшому навчанні та службі.

Список джерел

1. Ставровский А. Б. - "Первые шаги в програмировании" 2008.

. Рябко Б.Я., Фионов А.Н. Криптографические методы защиты информации. - Москва. - Изд-во Горяч. Линия-Телеком, 2010.

. Сыпченко Р. П. - "Основы алгоритмизации задач и управления" 2002.

. Фридман "Основы Си" 2007.

. Проценко В.С., Чаленко П.Й., Ставровський А.Б. "Технiка програмування мовою Сi: Навч.посiбник" 2009.

6. Вікіпедія.

Источник: https://www.bibliofond.ru/detail.aspx?id=870353