Завдання 1. Симетричне шифрування
Вибрати ключі та розробити програму для зашифрування файлу даних заданим афінним шифром. Тип афінного шифру визначається останньою цифрою і НЗК (Таблиця 1). Об'єм алфавіту NА визначається передостанньою цифрою j
НЗК і дорівнює 2(5+і) при j ≠ 3 і 215 при j = 3.
Номер залікової книжки 90085
Отже тип афінного шифру - 5 mod6=5 (афінний 3-го порядку)
Об’єм алфавіту 2(13)
Програма шифрування
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
const size_t small_buff = 20;
const size_t big_buff = 102400;
void main() {
clrscr();
char text[small_buff];
char bigtext[big_buff];
FILE *infile = fopen( "f:\\cc.txt", "r" ); /*відкриваєм файл*/
size_t read_len = 0;
size_t file_len = 0;
while( read_len = fread(text, 1, small_buff, infile ) ) /*знаходимо довжину файлу*/
{
memcpy( bigtext + file_len, text, read_len );
file_len += read_len;
}
int j,a3,a1,a2,i;
int klych1[]={1,1,1,0,0,1,1,1,1,0,0,0,0}; /*задаємо значення ключів і зсувів*/
int klych2[]={0,1,1,0,0,1,1,1,1,0,0,0,0};
int klych3[]={0,1,1,0,0,1,1,0,1,0,0,0,0};
int zsyv1[]={0,1,1,0,0,1,1,1,1,0,0,0,0};
int zsyv2[]={0,1,1,0,0,1,1,1,1,0,0,0,0};
int zsyv3[]={0,1,1,0,0,1,1,1,1,0,0,0,0};
int kk,b1,b2,b3,k[13]; char zyb1; kk=pow(2,13);
for(i=0;i<13;i++) /*очищуєм масив*/
{k[i]=0;}
for(i=0;i<13;i++) /*знаходимо значення ключа 1-го*/
{{ if (1==klych1[i])
k[i]=pow(2,i);
else k[i]=0;}
a1=a1+k[i];}
for(i=0;i<13;i++) /*знаходимо значення зсуву 1-го*/
{{ if (1==zsyv1[i])
k[i]=pow(2,i);
else k[i]=0;}
b1=b1+k[i];}
for(i=0;i<13;i++) /*знаходимо значення ключа 2-го*/
{{ if (1==klych2[i])
k[i]=pow(2,i);
else k[i]=0;}
a2=a2+k[i];}
for(i=0;i<13;i++) /*знаходимо значення зсуву 2-го*/
{{ if (1==zsyv2[i])
k[i]=pow(2,i);
else k[i]=0;}
b2=b2+k[i];}
for(i=0;i<13;i++) /*знаходимо значення ключа 3-го*/
{{ if (1==klych3[i])
k[i]=pow(2,i);
else k[i]=0;}
a3=a3+k[i];}
for(i=0;i<13;i++) /*знаходимо значення зсуву 3-го*/
{{ if (1==zsyv3[i])
k[i]=pow(2,i);
else k[i]=0;}
b3=b3+k[i];}
kk=pow(2,13);
for(j=0;j<file_len-3;j=j+3) /*шифровуєм текст*/
{
bigtext[j]=bigtext[j]*a1+ bigtext[j+3]*a2+ bigtext[j+6]*a3+b1;
bigtext[j]=bigtext[j]%kk;
bigtext[1+j]=bigtext[1+j]*a1+ bigtext[1+j+3]*a2+ bigtext[1+j+3+3]*a3+b2;
bigtext[1+j]=bigtext[1+j]%kk;
bigtext[2+j]=bigtext[2+j]*a1+ bigtext[2+j+3]*a2+ bigtext[2+j+3+3]*a3+b3;
bigtext[2+j]=bigtext[2+j]%kk;
}
FILE *outfile = fopen( "f:\\resul.txt", "w" ); /*створюєм файл з шифртекстом*/
fwrite( bigtext, 1, file_len, outfile ); /*записуєм шифр текст в файл*/
fclose( infile );
fclose( outfile ); }
текст повідомлення: текст для за шифрування
крипто текст: ецйшкечрст.бзчздччзфщяч
Блок схема програми
а) Зашифрувати Слово відкритого тексту за алгоритмом RSA. Слово визначається останньою буквою і НЗК і задане в Таблиці 2. Для генерування ключів використати числа р та q, які визначаються передостанньою цифрою j НЗК і задані в Таблиці 3.
Букви тексту замінити натуральними числами, що відповідають порядковому номеру букви в українському алфавіті. Наприклад А=00, Б=01, В=02 і т.д.
отже і=5 тоді потрібно зашифрувати слово (хід)
де Р=7 ,а Ч=17
n=p*q=7*13=91
f(n)=n-p-q+1=91-7-13+1=72
e=3
d=19
шифрування слова
д=25,в=11,а=05
25^3mod91=64
11^3mod91=57
05^3mod91=34
зашифрований текст: 64 57 34
б) Скласти програму зашифрування файлу за алгоритмом RSA. Об'єм алфавіту кодування - na . Величина блоку - 4 ]og2 NA [.
Величина блоку =16
об’єм алфавіту=13
ТЕОРИТИЧНІ ВІДОМОСТІ
Програма шифрування
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
const size_t small_buff = 20;
const size_t big_buff = 1024000;
char binarn(char a, int n, int m);
void main() {
clrscr();
char text[small_buff];
char btext[big_buff];
FILE *infile = fopen( "f:\\cc.txt", "rb" ); /*відкриваєм файл з крипто текстом*/
FILE *outfile = fopen( "f:\\result1.txt", "wb" ); /*створюєм файл для запису шифртексту*/
size_t read_len = 0;
size_t file_len = 0;
while( read_len = fread(text, 1, small_buff, infile ) ) /*знаходимо довжину файлу*/
{
memcpy( btext + file_len, text, read_len );
file_len += read_len;
}
int q,f,p,k,i,e,chuslo;q=231;p=11;
/*формуємо початкові умови шифрування*/
chuslo=q*p;
char slovo,slovo1,z;
f=chuslo-p-q+1;
/*знаходим відкритий ключ*/
printf(”vvedit proste chuslo e v mezax= “);
printf(“%d\n”,f);
printf("e=");
scanf(“%d”,&e);
/*знаходим таємний ключ*/
for(i=0;i<=e;i++)
{ if (1==e*i%f)
{k=i;break;} else k=0; }
for(int j1=0;j1<file_len-2;j1=j1+2)
{
/*ділимо текст на блоки*/
for(int j=1;j>=0;j--)
{for (int i=0;i<13;i++)
{
z=(z<<1) | btext[j+j1] & 1;
btext[j+j1]= (btext[j+j1]>>1);
}
}char slovo=0;
for (int i=0;i<13*2;i++)
{
slovo=(slovo<<1) | z & 1;
z= (z>>1);
}
/*здійснюєм піднесення до степеня по модулю*/
slovo=binarn(slovo,e,chuslo);
/*замінюєм блоки на слова*/
for (int i=0;i<13*2;i++)
{
z=(z<<1) | slovo& 1;
slovo= (slovo>>1);
}
for( j=1;j>=0;j--)
{ for (i=0;i<13;i++)
{
btext[j+j1]=(btext[j+j1]<<1) | z & 1;
z= (z>>1) ;
}
}
}
/*записуєм зашифрований текст в файл*/
fwrite( btext, 1, file_len, outfile );
fclose( infile );
fclose( outfile ); getch(); }
/*бінарний метод піднесення до степеня*/
char binarn(char a, int n, int m) {
if (n == 1)
return a % m;
char z;
z = binarn(a, n / 2, m);
z = (z * z) % m;
if (n % 2 == 1) z = (z * a) % m;
return z;
}
текст повідомлення: текст для за шифрування
крипто текст: 6ebut%=+q ?%w 6&r+5р№4;!
Блок схема програми
Висновок: в даному курсовому проекті сформовано два шифри Афінний і RSA. На базі теоретичних знань було написано програми шифрування тексту даних шифрів та аналіз програми за допомогою блок-схеми.