Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра Безпеки Інформаційних Технологій
Звіт
Про виконання лабораторної роботи № 5
“Криптографічні системи та протоколи”
Львів 2012
Мета роботи: Вивчити математичні основи побудови алгоритму шифрування RSA, методи криптоаналізу та вимоги до стійкості алгоритму RSA, навчитися розробляти програмне забезпечення для шифрування та цифрового підпису з використанням алгоритму RSA.
Теоретичні відомості
Безпека RSA базується на складності розкладу на множники великих чисел. Відкритий та закритий ключі є функціями двох великих (більше двохсот десяткових розрядів) простих чисел. Відновлення відкритого тексту за шифротекстом і відкритим ключем еквівалентне розкладу на множники двох великих чисел.
Для генерації двох ключів використовуються два великих випадкових простих числа p і q однакової довжини. Розширений алгоритм Евкліда використовується для обчислення ключа розшифрування d такого, що
ed=1(mod(p-1)(q-1)). (1)
Іншими словами
d=e-1mod((p-1)(q-1)) (2)
d і n=pq є взаємно простими числами. Числа e і n – це відкритий ключ, а число d – закритий. Для шифрування повідомлення m воно спочатку розбивається на цифрові блоки, які менші за n (для двійкових даних вибирається найбільший степінь числа 2, менший за n). А саме, якщо p і q – 100-розрядні прості числа, то n буде мати приблизно 200 розрядів і кожен блок повідомлення mi повинен мати також приблизно 200 розрядів. Зашифроване повідомлення c буде складатися з блоків ci такої ж довжини. Формула шифрування має вигляд:
ci=mie mod n (3)
Для розшифрування повідомлення береться кожен зашифрований блок ci і обчислюється
mi=cid mod n (4)
Оскільки
cid=(mie)d=mied=mik(p-1)(q-1)+1=mimik(p-1)(q-1)=mi*1=mi
то формула відновлює повідомлення.
Для піднесення до степеня за модулем n використовується бінарний алгоритм:
Задано: .
Обчислити: .
Вважається, що d < n. Алгоритм у вигляді прямолінійної програми для обчислення функції має вигляд.
Показник подається у двійковій системі числення: , де і . Присвоюється . Тоді -та команда задається так:
Всього команд . Результатом виконання останньої є
Всього витрачається множень.
Нехай p=47, q=71. Тоді
N=pq=3337.
Ключ e не повинен мати спільних множників
(p-1)(q-1)=46*70=3220
Вибираємо випадково e, наприклад, 79. Тоді d=79-1mod 3220=1019.
Під час обчислення використаний розширений алгоритм Евкліда. Зробимо e і n загальнодоступними, а d збережемо в секреті. Відкидаємо p і q. Для шифрування повідомлення m=6882326879666683 спочатку розбиваємо його на малі блоки. Для розглянутого випадку використовуємо трибуквенні блоки. Повідомлення розіб’ється на шість блоків mi.
m1=688
m2=232
m3=687
m4=966
m5=668
m6=003
Перший блок шифрується 68879 mod 3337=1570=c1.
Виконуючи такі самі операції для наступних бітів, одержимо шифротекст повідомлення:
c=1570 2756 2091 2276 2423 158
Для розшифрування потрібно виконати операцію піднесення до степеня, використовуючи ключ розшифрування 1019:
15701019 mod 3337 =688 =m1
Аналогічно відновлюється інша частина повідомлення.
ЗАВДАННЯ
1) Вивчити математичні основи, принципи побудови та вразливості алгоритму шифрування RSA.
2) Скласти блок-схеми алгоритмів та програму для реалізації шифрування та розшифрування відкритого тексту за допомогою алгоритму шифрування RSA. Забезпечити введення ключів з клавіатури. Для виконання операції піднесення до степеня за модулем використати бінарний алгоритм.
Блок-схема:
Остаточна версія програми:
outtext.setText(null);
if (code.isSelected() == true) {
String intexts = this.intext.getText();
StringBuilder sb = new StringBuilder(intexts);
for (;;) {
if (sb.length() % 3 != 0) {
sb.append(0);
} else {
break;
}
}
String inter = sb.toString();
char textchd[] = inter.toCharArray();
int textint[] = new int[3];
for (int k = 0;; k += 3) {
if (k > textchd.length - 1) {
break;
}
int l = 0;
for (int i = k; i < k + 3; i++) {
textint[l] = textchd[i] - 48;
l++;
}
// String sss = textint.toString();
// int textout = 0;// = Integer.parseInt(sss);
int textit = textint[0] * 100 + textint[1] * 10 + textint[2];
String rrr = Integer.toString(textit);
BigInteger bgi = new BigInteger(rrr);
rrr = "79";
BigInteger step = new BigInteger(rrr);
rrr = "3337";
BigInteger modul = new BigInteger(rrr);
bgi = bgi.modPow(step, modul);
String aString = bgi.toString();
// this.Text2.setText(aString);
this.outtext.append(aString + " ");
}
} else {
String intexts = this.intext.getText();
StringBuilder sb = new StringBuilder(intexts);
String inter = sb.toString();
char textchd[] = inter.toCharArray();
int textint[] = new int[4];
for (int k = 0;; k += 5) {
if (k > textchd.length - 1) {
break;
}
int l = 0;
for (int i = k; i < k + 4; i++) {
textint[l] = textchd[i] - 48;
l++;
}
// String sss = textint.toString();
// int textout = 0;// = Integer.parseInt(sss);
int textit = textint[0] * 1000 + textint[1] * 100 + textint[2]
* 10 + textint[3];
String rrr = Integer.toString(textit);
BigInteger bgi = new BigInteger(rrr);
rrr = "1019";
BigInteger step = new BigInteger(rrr);
rrr = "3337";
BigInteger modul = new BigInteger(rrr);
bgi = bgi.modPow(step, modul);
String aString = bgi.toString();
// this.Text2.setText(aString);
this.outtext.append(aString + " ");
}
}
// TODO add your handling code here:
Результати роботи програми:
Приклад за шифрування тексту:
Приклад розшифрування тексту:
Висновок: На даній лабораторній роботі я вивчив математичні основи побудови алгоритму шифрування RSA, методи криптоаналізу та вимоги до стійкості алгоритму RSA, навчився розробляти програмне забезпечення для шифрування та цифрового підпису з використанням алгоритму RSA..
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!