Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська Політехніка»
Звіт
Про виконання лабораторної роботи №1
з курсу «Прикладна криптологія»
на тему «Потоковий шифр на основі генератора BBS»
Перевірив: Петришин А.В.
Львів – 2012
Мета: Створити потоковий шифр з використанням програмного генератора псевдовипадкових послідовностей BBS.
Завдання: Скласти програму, яка б реалізовувала шифрування та розшифрування на основі генератора BBS.
Код програми на мові JavaScript:
<html><head><title>asdf</title></head>
<body><form name="asdf"><input type=text name="text"><br>
p = <input type=text name="pq"> <span class="key" id="1"></span><br>
q = <input type=text name="qp"> <span class="key" id="2"></span><br>
x = <input type=text name="xp"> <span class="key" id="3"></span><br>
<input type="button" value="Зашифрувати" onclick='Encrypt();'>
<input type="button" value="Розшифрувати" onclick='Decrypt();'>
</form><script>
function Encrypt( ){var text = document.asdf.text.value.toLowerCase();
var cryptotext=""; var mass = new Array(
101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,
193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,
293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,
409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,
521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,
641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,
757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,
881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997);
p = Math.floor(Math.random()*900)+100; while (p%4!=3) p++;
q = Math.floor(Math.random()*900)+100; while (q%4!=3) q++;
var x=0; do {x = Math.floor(Math.random()*143); x=mass[x];}
while ((x==p)||(x==q)); var n = p * q;
var p_span = document.getElementById(1);
var q_span = document.getElementById(2);
var x_span = document.getElementById(3);
q_span.innerHTML = q; p_span.innerHTML = p; x_span.innerHTML = x;
text=Convert(text);for(i=0;i<text.length;i++) {x=(x*x)%n; s=x%2; cryptotext+=(text.charAt(i)*1+s*1)%2+"";}m="";text="";for(i=0;i<cryptotext.length;i++) {m+=cryptotext.charAt(i); if(m.length==5) {text+=n2l(m);m="";}}alert(text);}
function Decrypt( ){var p=document.asdf.pq.value;
var q=document.asdf.qp.value;var x=document.asdf.xp.value;
var n=p*q;var text=document.asdf.text.value.toLowerCase();
var text=Convert(text);var cryptotext="";var m="";
for(i=0;i<text.length;i++) {x=(x*x)%n; s=x%2; cryptotext+=(text.charAt(i)*1+s*1)%2+"";}
text="";for(i=0;i<cryptotext.length;i++) {m+=cryptotext.charAt(i); if(m.length==5) {text+=n2l(m);m="";}}alert(text);}
function Convert(a){var b = "";for(i=0;i<a.length;i++) {b+=l2n(a.charAt(i));}return b;}
function l2n(l){switch (l) {
case 'а': return '00000'; break;case 'б': return '00001'; break;case 'в': return '00010'; break;
case 'г': return '00011'; break;case 'д': return '00100'; break;case 'е': return '00101'; break;
case 'є': return '00110'; break;case 'ж': return '00111'; break;case 'з': return '01000'; break;
case 'и': return '01001'; break;case 'і': return '01010'; break;case 'ї': return '01011'; break;
case 'й': return '01100'; break;case 'к': return '01101'; break;case 'л': return '01110'; break;
case 'м': return '01111'; break;case 'н': return '10000'; break;case 'о': return '10001'; break;
case 'п': return '10010'; break;case 'р': return '10011'; break;case 'с': return '10100'; break;
case 'т': return '10101'; break;case 'у': return '10110'; break;case 'ф': return '10111'; break;
case 'х': return '11000'; break;case 'ц': return '11001'; break;case 'ч': return '11010'; break;
case 'ш': return '11011'; break;case 'щ': return '11100'; break;case 'ь': return '11101'; break;
case 'ю': return '11110'; break;case 'я': return '11111'; break;default: return "";}}
function n2l(n){switch (n) {
case '00000': return 'а'; break;case '00001': return 'б'; break;case '00010': return 'в'; break;
case '00011': return 'г'; break;case '00100': return 'д'; break;case '00101': return 'е'; break;
case '00110': return 'є'; break;case '00111': return 'ж'; break;case '01000': return 'з'; break;
case '01001': return 'и'; break;case '01010': return 'і'; break;case '01011': return 'ї'; break;
case '01100': return 'й'; break;case '01101': return 'к'; break;case '01110': return 'л'; break;
case '01111': return 'м'; break;case '10000': return 'н'; break;case '10001': return 'о'; break;
case '10010': return 'п'; break;case '10011': return 'р'; break;case '10100': return 'с'; break;
case '10101': return 'т'; break;case '10110': return 'у'; break;case '10111': return 'ф'; break;
case '11000': return 'х'; break;case '11001': return 'ц'; break;case '11010': return 'ч'; break;
case '11011': return 'ш'; break;case '11100': return 'щ'; break;case '11101': return 'ь'; break;
case '11110': return 'ю'; break;case '11111': return 'я'; break;default: return "";}}
</script></body></html>
Результати роботи програми.
Зашифровка тексту:
Розшифровка тексту:
Висновок.
Я ознайомився з принципом роботи потокових шифрів і програмно реалізував такий шифр, що використовує генератор ключів на основі алгоритму BBS.
Програма перетворює вхідне повідомлення таким чином:
32 букви укр. алфавіту (г = ґ) приводяться до нижнього регістру і перетворюються у 5-бітові послідовності, а всі знаки, символи, цифри і пробіли ігноруються.