МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Інститут комп”ютерних технологій, автоматики та метрології
кафедра автоматики та телемеханіки
Курсова робота
з курсу: “ Методи та засоби криптографічних перетворень”
Львів – 2005
Зміст
Завдання
Шифрування афінним шифром
Теоретичні відомості про афінний шифр
Блок-схема алгоритму шифрування афінним шифром
Текст програми шифрування афінним шифром
Вхідний текст
Зашифрований текст
Шифрування RSA
Теоретичні відомості про шифр RSA
Теоретичне зашифрування тексту методом RSA
Висновки
Література
Завдання
1. Симетричне шифрування
Вибрати ключі та розробити програму для зашифрування файлу даних заданих афінним шифром. Тип афінного шифру визначається останьою цифрою НЗК. Об’єм алфавіту визначається передостанньою цифрою НЗК і дорівнює .
Варіант
2
Тип афінного шифру
Афінний першого порядку
Розрядність алфавіту
14
Об‘єм алфавіту
16384
2. Асиметричне шифрування
Зашифрувати Слово відкритого тексту за алгоритмом RSA. Слово визначається останньою буквою НЗК і задане в таблиці. Для генерування ключів використовувати числа р та , які визначаються передостанньою цифрою НЗК і задані в таблиці.
і
8
Слово
Н
И
З
9
11
13
Букви тексту замінити натуральними числами, що відповідають порядковому номеру букви в українському алфавіті. Наприклад А=00, Б=01, В=02 і т.д.
Теоретичні відомості
Афінні шифри- підклас шифрів заміни, що включає, як частковий випадок шифр Віжінера і навіть шифр перестановки з фіксованим періодом.
N-символьний алфавіт ототожнюємо з кільцем . А саме кожна буква замінюється своїм номером у алфавіті, причому нумерація починається з нуля. Наприклад, латинська абетка ототожнюється із , а українська із . Літера а української абетки трактується як нуль, літера б як 1, в як 2. Тепер до букв відкритого тексту ми можемо вільно застосовувати операцію додавання та множення за відповідним модулем.
Афінний шифр.
Ключі: a, такі, що , , .
Шифрування. У повідомлені кожна буква заміщується буквою .
Дешифрування. У криптотексті кожна буква заміщуються буквою ,де і .
Блок-схема алгоритму
Функція кодування encrypt
Текст програми за шифрування
#include <stdio.h>
#include <math.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
/*============Constants================*/
const unsigned int m=5+9; //bits
const unsigned int n_buf=32; //bits
/*=============Types===================*/
/*===========Variables=================*/
unsigned long a, s, n;
/*======Function declaration===========*/
unsigned long max_value(int k);
unsigned long encrypt(unsigned long c);
void get_key(void);
/*==========MAIN FUNCTION==============*/
void main(void)
{
struct dostime_t tbegin, tend;
FILE *f, *fc;
int r_end=0, x_read=1;
unsigned long buf, buf_c = 0, x;
int lb=n_buf, lbc=n_buf;
get_key();
_dos_gettime(&tbegin);
n = max_value(m);
if ( (f=fopen("c:\\data.fb", "rb")) == NULL )
{
printf("cannot open the file data.fb");
getch();
exit(1);
}
else
if ( (fc=fopen("c:\\data.fbc", "wb")) == NULL )
{
printf("cannot open the file data.fbc");
getch();
exit(1);
}
else
{
if (fread(&buf, 1, n_buf/8, f) != 0)
while (!r_end)
{
if (lb<=0)
{
if (fread(&buf, 1, n_buf/8, f) != 0)
{
x |= (buf << (m+lb)) & max_value(m);
buf >>= (-lb);
lb += n_buf;
x_read = 1 & !(lb==n_buf);
}
else
{
r_end = 1;
x_read = 1;
}
}
else
{
x = buf & max_value(m);
buf >>= m;
lb -= m;
x_read = 1 & (lb>=0);
}
//----------------------------
if (x_read)
{
// printf("%0x --- %c\n", x, ( unsigned char)x);
// getch();
x = encrypt(x);
buf_c |= x << (n_buf-lbc);
lbc -= m;
if (lbc<=0)
{
fwrite(&buf_c, n_buf/8, 1, fc);
buf_c &= 0;
if (lbc==0)
lbc = n_buf;
else
{
buf_c |= x >> (m+lbc);
lbc += n_buf;
}
}
//-----------------------------
}
}
fcloseall();
_dos_gettime(&tend);
printf("Time : %d:%d:%d:%d", tend.hour-tbegin.hour,
tend.minute-tbegin.minute,
tend.second-tbegin.second,
tend.hsecond-tbegin.hsecond);
}
}
/*=========function definition=========*/
/*-------------------------------------*/
unsigned long max_value(int k)
{
return (int)(pow(2, k+1)-1);
}
/*-------------------------------------*/
unsigned long encrypt(unsigned long c)
{
return (unsigned long)fmod((a*c+s), n);
}
/*-------------------------------------*/
void get_key(void)
{
long int b, c, r;
do
{
printf("input multiple key a : ");
scanf("%d", &a);
printf("input addetive key s :");
scanf("%d", &s);
b=(a>s) ? a : s;
c=(a>s) ? s : a;
while (c!=0)
{
r=fmod(b,c);
b=c;
c=r;
}
if (b != 1)
printf("The keys you've entered are not mutually simple\n");
} while (b!=1);
}
Вхідний файл
ISBN 5-88548-067-2 Очевидно, что смысл Сети сетей состоит в разумности ограничения круга пользователей того или иного сервера. Если подобный сервер закупорен полностью, то и работать может с ним лишь тот, кто его закупорил. Поэтому, любая компания, прежде чем принять решение о вступлении в сообщество Internet, дает себе отчет в том, что существует возможность проникновения в свой главный сервер неких посторонних лиц. Вот эти посторонние лица и называются хакерами...
Авторские права на настоящую книгу, название серии "Кратко, доступно, просто" и оформление самой серии принадлежат Борису Леонтьеву. Полное или частичное копирование книги, а также публикация других рукописей в рамках этой серии без разрешения правообладателя является нарушением авторского права и может иметь юридические последствия в соответствии с действующим законодательством.
Вся информация, опубликованная в этой книге представлена в исключительно образовательных целях, а также для повышения квалификации программистов, системных администраторов и провайдеров Internet. Автор предупреждает читателей этой книги, что он не несет никакой ответственности за те последствия, которые могут возникнуть в результате проведения экспериментов с предоставленной информацией.
Все названия продуктов, упомянутые в этой книге, являются товарными знаками или зарегистрированными товарными знаками соответствующих организаций.
Программное обеспечение, описанное в этой книге, поставляется исключительно по лицензионному договору и может использоваться или копироваться только в соответствии с условиями этого договора. Копирование этого программного обеспечения на какой-либо носитель информации, если на это нет специального разрешения по лицензионному договору, является нарушением Закона Российской Федерации "О правовой охране программ для ЭВМ и баз данных" и норм международного права.
ЛР No 069954 от 01.12.1991 г. Сдано в набор 06.07.98. Подписано в печать 06.09.98. Формат 60X84/16.
Бумага типографская. Гарнитура "Newton". Печать офсетная. Физ. печ. л. 12. Тираж 5 000 экз. Заказ 48.
Hacker's Manifest
This is our world now... the world of the electron and the switch, the beauty of the baud.
We make use of a service already existing without paying for what could be dirt cheep if it wasn't run by profiteering gluttons, and you call us criminals. We explore...and you call us criminals. We exist without skin color, without nationality, without religious bias...and you call us criminals. You build atomic bombs, wage wars, murder, cheat, and lie to us and try to make us believe it is for our own good, yet we're the criminals.
Yes, I am a criminal. My crime is that of curiosity. My crime is that of judging people by what they say and think, not what they look like. My crime is that of outsmarting you, something that you will never forgive me for. I am a hacker and this is my manifesto. You may stop this individual, but you can't stop us all... after all, we're all alike.
Кто такие хакеры Очевидно, что смысл Сети сетей состоит в разумности ограничения круга пользователей того или иного сервера. Если подобный сервер закупорен полностью, то и работать может с ним лишь тот, кто его закупорил. Поэтому, любая компания, прежде чем принять решение о вступлении в сообщество Internet, дает себе отчет в том, что существует возможность проникновения в свой главный сервер неких посторонних лиц. Вот эти посторонние лица и называются хакерами.
Да, хакеры -- это те, кто взламывают сети.
Делается это разными способами. Например, через порт терминала или порт электронной почты.
Выбрав жертву, хакер прежде всего определяет, имеются ли на сервере плохие пароли, плохо настроенный софт или испорченная операционка. Затем выбирается метод собственной безопасности. Самый распространенный способ проникнуть в сеть так, чтобы остаться незамеченным -- это взлом по цепочке.
Существуют тонны программ, посредством которых компьютер может вести поиск пароля через перебор некоторого словаря имен. Сложнее вскрыть сеть, если пароль логина имеет больше шести символов, чувствителен к регистру или содержит цифры.
Но! В настоящее время многие сети открывают к себе доступ через автоматическое прохождение системы паролей. Эта система построена на так называемом файле паролей. В этом файле перечисляются доступные компьютеры и пароли сети. Что делает хакер? Он вламывается в сеть и скачивает этот файл. Все!
Другой способ взлома -- взлом через отладочные переключатели операционных систем. Как известно эти переключатели могут иногда находиться во включенном состоянии. Кроме всех этих вышеперечисленных приблудов, конечно же, широко используется предварительная вирусная атака. Взломав сеть, хакер заметает следы и уничтожает всю компрометирующую себя информацию. И через некоторое время сматывается.
Любой квалифицированный хакер через обыкновенный факс-модем может проникнуть даже в компьютер правительственного учреждения и, при желании, настолько внедриться в любую как бы то ни было защищенную систему, что просто-напросто разрушит ее. Так оно и было. Достаточно вспомнить злополучный сегмент Milnet сети сетей и всем известную лабу Rome ВМС США. Да, это был настоящий кошмар, когда один из этих чудаков-хакеров творил безобразия в течение недели на одной из самых секретных военных баз Америки!
Вскрыть сеть можно и с помощью обыкновенного факс-модема или даже факс-аппарата. Ведь в любой достаточно крупной компании факс подключен к LAN! А это значит, что через номер факса хакер открывает доступ к заветному шлюзу. Любой более или менее серьезный (или даже несерьезный) хакер Internet ориентируется на локальную сеть. Ему интересен софт защиты от несанкционированного доступа. Он спит новыми версиями firewall. Он смеется при упоминании дурацкого "брандмауэр". Sun! Sun! Sun! На мир Робин-Гудов надвигается шерифовский Sun! Все! Все погибли! Все хакеры стали системными администраторами! Они исправились. Они больше не будут...
Да-да, системные администраторы утверждают, что именно брандмауэр и есть то самое устройство, размещенное между локальной сетью и Internet, позволяющее разного рода придуркам отстать от нашего сервера. Вот именно, что только придуркам. Настоящим придуркам! Лицезреете пакетики для остановки шпионского трафика? А хакер давно завладел всеми функциями подтверждения полномочий! На самом деле хакер может сам проверить входные и выходные данные.
Теоретичні відомості
Генерування ключів. Вибирають два досить великі прості числа . Для їх добутку значення функції Ойлера дорівнює . Далі випадковим чином вибирають елемент , що не перевищує значення і взаємно простий з ним. Іншими словами, є випадковим елементом із множини . Для за алгоритмом Евкліда знаходять елемент , обернений до в , тобто такий, що і
.
Як результат покладають:
Відкритий ключ:
Таємний ключ:.
Шифрування відбувається блоками. Для цього повідомлення записують у цифровій формі і розбивають на блоки так, що кожен блок позначає число, яке не перевищує . Якщо блок записаний у вигляді двійкового слова довжини , то повинна виконуватись нерівність . Блок розглядається як елемент кільця і як такий, може підноситись до степеня за модулем .
Алгоритм шифрування у системі полягає у піднесені до степеня . Записується це так:
Теоретичне зашифрування тексту методом RSA
Знаходимо значення функції Ейлера
Вибираємо
За допомогою розширеного алгоритму Евкліда знайдемо найбільший спільний дільник і
Знаходимо -таємний ключ
Н
И
З
17
10
9
Розіб‘ємо повідомлення на блоки, які не перевищують . В даному випадку будемо кодувати по одній букві.
Вихідне повідомлення в цифровій формі
17
10
9
Зашифрований текст
8
72
98
Для піднесення числа до степеня за модулем було використано наступну програму
#include <iostream.h>
#include <math.h>
void main(void)
{
long double a, b, n;
cout << "\na?:";
cin >> a;
cout << "b?:";
cin >> b;
cout << "n?:";
cin >> n;
cout << "a^b mod n = " << fmod(pow(a, b), n);
}
Висновок:
Як і всі шифри простої заміни афінний шифр піддається частотному аналізу, проте він простий в реалізації і не потребує потужних ресурсів.
Шифр RSA є легким для розуміння проте виникають певні складності при програмній реалізації (піднесення великого числа до великого степеня за модулем якогось числа). Це забезпечує йому його стійкість до взлому. На даний момент не існує ефективних алгоритмів і обчислювальних систем для атаки шифру (хоча й не доведено, що їх не існує).
Література
1. О.В. Вербицький “Вступ до криптології”-Видавництво Науково-технічної літератури - Львів 1998 – 247 ст.
2. В. Жельников. Криптография от папируса до компютера ABF, Москва, 1996.
3. І. Я. Берегуляк Класичні методи криптування Львівський університет, 1997р.