Математико-алгоритмические методы криптозащиты
Проведение эксперимента по применению различных видов шифрования данных. Сравнение алгоритмов криптозащиты DES и RSA. Выявление их особенностей, устойчивости к взлому, достоинств и недостатков. Анализ сфер применения. Обзор исходных текстов программ.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | практическая работа |
Язык | русский |
Дата добавления | 21.08.2017 |
Размер файла | 869,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
MOV BP, AX
PC2_FOR_C
MOV [DI], BX ; Записываем первую часть Ki
MOV [DI+2], AX
MOV CX, ES ; CX:DX = Di
MOV DX, BP
PC2_FOR_D
MOV [DI+4], BX ; Записываем вторую часть Ki
MOV [DI+6], AX
MOV BX, ES ; AX:BX = Di
MOV AX, BP
POP DX ; CX:DX = Ci
POP CX
SUB DI, 8 ; Следующий ключ Ki
OR SI, SI
JZ decryption_key_L20
JMP decryption_key_L10
decryption_key_L20: POP DS
POP DI
POP SI
RET
decryption_key ENDP
END
Пр 2.1. Исходные тексты программы шифрования RSA
Файл RSA.h
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
#include <mem.h>
const int SIZE=512;
class chislo
{
//private:
public:
char data[SIZE+1];
void set_from_char(char* inp);
void Show();
void Show(int last);
void Show(char* description);
void Show_dec();
void Show_deta();
void To_dop();
void Add_with_offset(const chislo& inp,int offset);
void Zero();
void Set_one();
void Set_one (int offset);
void Set_minus_one();
int Is_not_null();
int Is_null();
int Is_one();
int Is_simple();
int Get_data(int i)
{ return data[i]; }
void Inc();
void Dec();
void Shl();
void Shr();
void Shr (int offset);
void Shl (int offset);
void Generate(int razrad);
chislo operator+(const chislo& inp);
chislo operator*(const chislo& inp);
chislo operator%(const chislo& inp);
chislo operator/(const chislo& inp);
chislo operator-(const chislo& inp);
void Add (const chislo& inp);
void Sub (const chislo& inp);
int operator>(const chislo& inp);
int operator<(const chislo& inp);
int operator==(const chislo& inp);
int Save(char* path_file);
int Load(char* path_file);
friend chislo ExtEuclid (chislo d, chislo f);
friend int witness(const chislo &a, const chislo& n);
friend chislo multi_and_get_mod (chislo mul_1, chislo mul_2, chislo mod);
};
Файл RSA.cpp
#include "RSA.H"
const BLOCK_SIZE = 10;
const BLOCK_SIZE2 = 64;
//Функция, получает буфер из 64 байт и конвертит ее в двоичный СТРОКОВЫЙ формат
void bin_to_bin_str(char * src, char* res)
{
int i,j, b, o;
for( i = 0; i < BLOCK_SIZE; i++ ){
b = (unsigned char)(src[i]);
for( j = 0; j < 8; ++j ){
o = b % 2;
b = b / 2;
res[8*BLOCK_SIZE-1-(i*8+j)] = 48 + o;
}
}
res[BLOCK_SIZE*8] = 0;
};
void bin_to_bin_str2(char * src, char* res)
{
int i,j, b, o;
for( i = 0; i < BLOCK_SIZE2; i++ ){
b = (unsigned char)(src[i]);
for( j = 0; j < 8; ++j ){
o = b % 2;
b = b / 2;
res[8*BLOCK_SIZE2-1-(i+1)*8+1+j] = 48 + o;
}
}
res[BLOCK_SIZE2*8] = 0;
};
void bin_str_to_bin( char* src, char* res ){
int i,j, b, o;
for( i = 0; i < BLOCK_SIZE2; i++ ){
b = 0;
o = 1;
for( j = 0; j < 8; ++j ){
b = b + o*src[(i+1)*8-1 - j];
o = o * 2;
}
res[i] = b;
}
};
void bin_str_to_bin2( char* src, char* res ){
int i,j, b, o;
for( i = 0; i < BLOCK_SIZE2; i++ ){
b = 0;
o = 1;
for( j = 0; j < 8; ++j ){
b = b + o*src[i*8+ j];
o = o * 2;
}
res[i] = b;
}
};
void stop()
{
if (getch()==27)
exit(0);
}
int chislo::Load(char* path_file)
{
printf("Load data from %s .\n",path_file);
int file_in=open(path_file,O_RDONLY);
if (file_in == -1)
{
printf("falied to load from %s !\nPress any key.\n",path_file);
return 1;
}
int flag=0;
char symbol;
for (int i=0;i<SIZE;i++)
{
flag+=read(file_in,&symbol,1);
data[i]=symbol-48;
}
if (flag!=SIZE)
{
printf("load is incorrect!\nPress any key.\n");
return 2;
}
return 0;
}
int chislo::Save(char* path_file)
{
printf("\nSave data in %s .\n",path_file);
FILE* file_out;
if ((file_out=fopen(path_file,"wt"))==NULL)
{
perror("Error:");
printf("failed to save in %s !\nPress any key.\n",path_file);
return 1;
}
for (int i=0;i<SIZE;i++)
fprintf(file_out,"%d",data[i]);
fclose(file_out);
return 0;
}
void chislo::Show(char* description)
{
printf("%s",description);
for (int i=SIZE-1;i>=0;i--)
{
printf("%d",data[i]);
if ((i%4)==0)
printf(".");
}
printf("\n");
}
void chislo::Dec()
{
for (int i=0;i<SIZE;i++)
{
data[i]++;
if (data[i]>1)
{
data[i]-=2;
data[i+1]++;
}
}
}
int chislo::Is_simple()
{
int razrad=SIZE-1;
while ( (razrad>=0) && (data[razrad]==0) )
razrad--;
if (razrad<2)
return 1;
chislo temp;
if (data[0]==0)
return 0;
printf("Mod % 2 <> 0!\n");
int temp_1=0;
for (int j=0;j<SIZE;j+=2)
temp_1+=data[j]+2*data[j+1];
if ( (temp_1%3)==0)
return 0;
printf("Mod % 3 <> 0!\n");
printf("Check other:");
int flag=0;
while ( (flag!=-1) && (flag<8) )
{
flag++;
printf ("%d",flag);
temp.Generate(razrad-1);
printf(" --* ");
if (witness(temp,(*this)))
flag=-1;
printf(" *-- ");
}
if (flag==-1)
return 0;
printf("THIS IS SIMPLE!\n");
return 1;
}
void chislo::Set_minus_one()
{
for (int i=0;i<SIZE;i++)
data[i]=1;
}
int witness (const chislo& a, const chislo& n)
{
chislo d,x,n_1;
d.Set_one();
n_1=n;
n_1.Dec();
int i=SIZE-1;
while (n_1.data[i]==0)
i--;
for (;i>=0;i--)
{
printf("%d.",i);
x=d;
d=(d*d)%n;
if ( (d.Is_one()) && (!(x.Is_one())) && (!(x==n_1)) )
{
printf("FAIL!");
return 1;
}
if (n_1.data[i])
{
d=(d*a)%n;
}
}
if (!(d.Is_one()))
{
printf("fail!\n");
return 1;
}
printf("Strage...\n");
return 0;
}
void chislo::Generate(int razrad)
{
for (int i=SIZE;i>razrad;i--)
data[i]=0;
for (i=1;i<razrad;i++)
data[i]=rand()%2;
data[razrad]=1;
data[0]=1;
}
int chislo::operator==(const chislo& inp)
{
for (int i=0;i<SIZE;i++)
if (data[i]!=inp.data[i])
return 0;
return 1;
}
void chislo::Inc()
{
int i=0;
data[0]++;
while ( (data[i]>1) && (i<SIZE) )
{
data[i]-=2;
data[i+1]++;
i++;
}
}
void chislo::Set_one(int offset)
{
for (int i=0;i<=SIZE;i++)
data[i]=0;
data[offset]=1;
}
chislo chislo::operator/(const chislo& inp)
{
chislo result,temp,temp_umen;
result.Zero();
int i,j;
for (i=0;i<SIZE;i++)
temp_umen.data[i]=data[i];
if (temp_umen<inp)
return result;
temp_umen.data[SIZE]=0;
while ( !(temp_umen<inp) && (!temp_umen.data[SIZE]) && (!temp_umen.data[SIZE-1]) )
{
for (j=0;j<SIZE;j++)
temp.data[j]=inp.data[j];
j=0;
temp.data[SIZE]=0;
while ( !(temp>temp_umen) && (!temp.data[SIZE]) && (!temp.data[SIZE-1]) )
{
temp.Shl();
j++;
}
temp.Shr();
j--;
temp_umen=temp_umen-temp;
temp.Set_one(j);
result=result+temp;
}
return result;
}
chislo ExtEuclid (chislo d, chislo f)
{
int i;
chislo X1,X2,X3,Y1,Y2,Y3,Q,T1,T2,T3;
X1.Set_one();
X2.Zero();
Y1.Zero();
Y2.Set_one();
for (i=0;i<SIZE;i++)
{
Y3.data[i]=d.data[i];
X3.data[i]=f.data[i];
}
X3.data[SIZE]=0;
Y3.data[SIZE]=0;
Y3.data[SIZE-1]=0;
i=0;
do
{
i++;
printf(".");
Q=X3/Y3;
T1=X1-(Q*Y1);
T2=X2-(Q*Y2);
T3=X3-(Q*Y3);
X1=Y1;
X2=Y2;
X3=Y3;
Y1=T1;
Y2=T2;
Y3=T3;
}while ( (!Y3.Is_null()) && (!Y3.Is_one()) );
if (Y3.Is_null())
return Y3;
if (f<Y2)
Y2=Y2+f;
return Y2;
}
void chislo::Set_one()
{
for (int i=1;i<=SIZE;i++)
data[i]=0;
data[0]=1;
}
void chislo::Show_dec()
{
int result=data[0],shag=1;
for (int i=1;i<SIZE;i++)
{
shag*=2;
if (data[i])
result+=shag;
}
printf("CHISLO:%d\n",result);
}
void chislo::Shl()
{
for (int i=SIZE-1;i>0;i--)
data[i]=data[i-1];
data[0]=0;
}
void chislo::Shl (int offset)
{
for (int i=SIZE-offset;i>=offset;i--)
data[i]=data[i-offset];
for (i=0;i<offset;i++)
data[i]=0;
}
void chislo::Shr()
{
for (int i=0;i<(SIZE-1);i++)
data[i]=data[i+1];
data[SIZE-1]=0;
data[SIZE]=0;
}
void chislo::Shr(int offset)
{
for (int i=offset;i<(SIZE-offset);i++)
data[i]=data[i+offset];
for (i=SIZE;i>=(SIZE-offset);i++)
data[i]=0;
}
chislo chislo::operator%(const chislo& inp)
{
chislo result,temp;
result.Zero();
if ((*this)==inp)
return result;
for (int i=0;i<SIZE;i++)
result.data[i]=data[i];
while (!(result<inp) && !(result.data[SIZE]) && !(result.data[SIZE-1]))
{
for (i=0;i<SIZE;i++)
temp.data[i]=inp.data[i];
while ((temp<result) && !(temp.data[SIZE-1]))
temp.Shl();
temp.Shr();
result=result-temp;
}
return result;
}
chislo chislo::operator*(const chislo& inp)
{
chislo result;
result.Zero();
for (int i=0;i<SIZE;i++)
if (data[i])
result.Add_with_offset(inp,i);
return result;
}
chislo chislo::operator+(const chislo& inp)
{
chislo result;
result.Zero();
for (int i=0;i<SIZE;i++)
{
result.data[i]+=data[i]+inp.data[i];
if (result.data[i]>1)
{
result.data[i]-=2;
result.data[i+1]++;
}
}
return result;
}
chislo chislo::operator-(const chislo& inp)
{
chislo result;
result.Zero();
for (int i=0;i<SIZE;i++)
{
result.data[i]=data[i]-inp.data[i]-result.data[i];
if (result.data[i]<0)
{
result.data[i]+=2;
result.data[i+1]++;
}
}
return result;
}
int chislo::Is_one()
{
for (int i=1;i<SIZE;i++)
if (data[i])
return 0;
if (data[0]==1)
return 1;
return 0;
}
int chislo::Is_null()
{
for (int i=0;i<SIZE;i++)
if (data[i])
return 0;
return 1;
}
int chislo::Is_not_null()
{
for(int i=0;i<SIZE;i++)
if (data[i])
return 1;
return 0;
}
void chislo::Zero()
{
for (int i=0;i<=SIZE;i++)
data[i]=0;
}
void chislo::Add_with_offset(const chislo& inp,int offset)
{
if (offset>=SIZE)
return;
for (int i=offset;i<SIZE;i++)
{
data[i]+=inp.data[i-offset];
if (data[i]>1)
{
data[i]-=2;
data[i+1]++;
}
}
}
void chislo::To_dop()
{
for (int i=0;i<SIZE;i++)
if (data[i])
{
data[i]=0;
}
else
{
data[i]=1;
}
i=0;
data[0]++;
while ( (data[i]>1) && (i<SIZE) )
{
data[i]-=2;
data[i+1]++;
i++;
}
}
void chislo::Show()
{
for (int i=SIZE-1;i>=0;i--)
printf("%d",data[i]);
}
void chislo::Show(int last)
{
if (last>(SIZE-1))
last=SIZE-1;
for (int i=last;i>=0;i--)
printf("%d",data[i]);
}
void chislo::set_from_char (char* inp)
{
Zero();
int size=strlen(inp);
if (size>SIZE)
size=SIZE;
for (int i=0;i<size;i++)
data[size-i-1]=inp[i]-48;
}
void chislo::Show_deta()
{
for (int i=SIZE-1;i>=0;i--)
printf("%d:",data[i]);
}
chislo up_to_exp_and_get_mod (chislo osn, chislo pokaz, chislo mod)
{
chislo result;
result.set_from_char("1");
int i=SIZE-1;
while(pokaz.data[i]==0)
i--;
for (i;i>=0;i--)
{
printf(".");
result=(result*result)%mod;
if (pokaz.data[i])
result=(result*osn)%mod;
}
return result;
}
int chislo::operator> (const chislo& inp)
{
for (int i=SIZE-1;i>=0;i--)
{
if (data[i]<inp.data[i])
return 0;
if (data[i]>inp.data[i])
return 1;
}
return 0;
}
int chislo::operator< (const chislo& inp)
{
for (int i=SIZE-1;i>=0;i--)
{
if (data[i]>inp.data[i])
return 0;
if (data[i]<inp.data[i])
return 1;
}
return 0;
}
void chislo::Add(const chislo& inp)
{
for (int i=0;i<SIZE;i++)
{
data[i]+=inp.data[i];
if (data[i]>1)
{
data[i]-=2;
data[i+1]++;
}
}
}
void chislo::Sub(const chislo& inp)
{
for (int i=0;i<SIZE;i++)
{
data[i]-=inp.data[i];
if (data[i]<0)
{
data[i]+=2;
data[i+1]--;
}
}
}
Файл my_rsa.cpp
#include "rsa.cpp"
extern unsigned _stklen = 54210U;
const int SIZE_GEN=(SIZE/2)-2;
void main ()
{
clrscr();
randomize();
chislo p,q,n,e,d,f,text;
int flag=1,razrad;
while ((flag!=0)&&(flag<100))
{
flag++;
razrad=(rand()%(SIZE_GEN/4))+20;
printf("\nTry to create P N %d with %d razrad.\n",flag-1,razrad);
p.Generate(razrad);
if(p.Is_simple())
flag=0;
}
if (flag)
{
printf("\n*** Create 'P' is failed! ***\n");
stop();
exit(0);
}
printf("Create 'P' is complite!\n");
stop();
flag=1;
razrad=(SIZE_GEN/2)-razrad-1;
while ((flag!=0)&&(flag<100))
{
flag++;
printf("\nTry to create Q N %d with %d razrad.\n",flag-1,razrad);
q.Generate(razrad);
if(q.Is_simple())
flag=0;
}
if (flag)
{
printf("\n*** Create 'Q' is failed! ***\n");
stop();
exit(0);
}
printf("Create 'Q' is complite!\n");
stop();
n=p*q;
d=p;
d.Dec();
e=q;
e.Dec();
f=e*d;
flag=1;
while (flag)
{
printf("Try to create e & d N %d",flag);
flag++;
razrad=rand()%(SIZE_GEN/4)+2;
d.Generate(razrad);
if ((d.Is_not_null()) && (!d.Is_one()) )
{
e=ExtEuclid(d,f);
if (e.Is_not_null())
flag=0;
}
}
if (e.Save("open.key") || n.Save("mod.key") || d.Save("close.key") )
return;
printf("\nGenerate is complite!\n");
getch();
}
Файл code.cpp
#include "RSA.CPP"
extern unsigned _stklen = 54210U;
const int SIZE_GEN=(SIZE/2)-2;
int main( int argc, char *argv[] )
{
printf("CODE DATA BY RSA: \n");
if( argc < 3 ){
printf("CODE <crypt_file> <decrypt_file> \n");
return 0;
}
chislo open_key,mod_key,text;
if (open_key.Load("open.key") || mod_key.Load("mod.key") )
return 0;
int flag=1,i,len, cur_len;
char buff[1000];
char fbuff[255];
//Открываем файл для чтения
FILE* fin, *fout;
int in_size, out_size;
fin = fopen( argv[1], "rb+" );
//Открываем файл для записи
fout = fopen( argv[2], "wb+" );
fseek( fin, 0L, SEEK_END );
in_size = ftell( fin );
fseek( fin, 0L, SEEK_SET );
//Записываем размер в файл
fprintf( fout, "%d\n", in_size );
while( !feof( fin ) ){
//Читаем строку
len = fread( fbuff, 1, BLOCK_SIZE, fin );
if( !len ) break;
//Если надо - дополняем строку
if( len < BLOCK_SIZE ){
for( i = len; i < BLOCK_SIZE; ++i )
fbuff[i] = 0;
}
//Переводим строку в двоичный формат
bin_to_bin_str(fbuff, buff);
printf("%s \n", buff);
//Шифруем
text.set_from_char(buff);
text.Show("\nYou input TEXT:");
text=up_to_exp_and_get_mod(text,open_key,mod_key);
//Записываем результат
bin_str_to_bin( text.data, fbuff );
fwrite( fbuff, 1, BLOCK_SIZE2, fout );
}
fclose( fin );
fclose( fout );
return 0;
}
Файл uncode.cpp
#include "rsa.cpp"
extern unsigned _stklen = 54210U;
int main( int argc, char *argv[] )
{
printf("UNCODE DATA:\n");
chislo close_key,mod_key,text;
if (close_key.Load("close.key")
|| mod_key.Load("mod.key") )
return 0;
char* buff=(char*)malloc(SIZE+5);
char fbuff[255];
//Открываем файл для чтения
FILE* fin, *fout;
int in_size, out_size, cur_size = 0, len, i;
fin = fopen( argv[1], "rb+" );
//Открываем файл для записи
fout = fopen( argv[2], "wb+" );
//Записываем размер в файл
fscanf( fin, "%d\n", &in_size );
while( !feof( fin ) ){
//Читаем строку
len = fread( fbuff, 1, BLOCK_SIZE2, fin );
if( !len ) break;
//Если надо - дополняем строку
if( len < BLOCK_SIZE2 ){
for( i = len; i < BLOCK_SIZE2; ++i )
fbuff[i] = 0;
}
//Переводим строку в двоичный формат
bin_to_bin_str2(fbuff, buff);
//Шифруем
text.set_from_char(buff);
text.Show("\nYou input TEXT:");
text=up_to_exp_and_get_mod(text,close_key,mod_key);
//Записываем результат
bin_str_to_bin2( text.data, fbuff );
if( in_size - cur_size >= BLOCK_SIZE ){
fwrite( fbuff, 1, BLOCK_SIZE, fout );
cur_size += BLOCK_SIZE;
}else{
fwrite( fbuff, in_size - cur_size, 1, fout );
cur_size += in_size - cur_size;
}
}
fclose( fin );
fclose( fout );
printf("\nUncode is complite!\n");
return 0;
}
Размещено на Allbest.ru
Подобные документы
Сущность и история разработки алгоритма криптозащиты Эль-Гамаля. Основы этого типа шифрования, особенности генерации ключей. Специфика реализации системы криптозащиты средствами процессора ADSP-2181 в расширенных полях Галуа. Блок-схемы программирования.
контрольная работа [1,0 M], добавлен 13.01.2013История криптографии. Сравнение алгоритмов шифрования, применение в операционной системе. Анализ продуктов в области пользовательского шифрования. Включение и отключение шифрования на эллиптических кривых. Использование хеш-функции. Электронная подпись.
курсовая работа [492,6 K], добавлен 18.09.2016Автоматизация процесса шифрования на базе современных информационных технологий. Криптографические средства защиты. Управление криптографическими ключами. Сравнение симметричных и асимметричных алгоритмов шифрования. Программы шифрования информации.
курсовая работа [795,7 K], добавлен 02.12.2014Сравнение производительности программных реализаций алгоритмов шифрования с оптимизациями под языки С и Java. История разработки, сущность, принципы шифрования и успехи в криптоанализе таких алгоритмов шифрования как AES, RC4, RC5, RC6, Twofish и Mars.
реферат [1,3 M], добавлен 13.11.2009Особенности шифрования данных, предназначение шифрования. Понятие криптографии как науки, основные задачи. Анализ метода гаммирования, подстановки и метода перестановки. Симметрические методы шифрования с закрытым ключом: достоинства и недостатки.
курсовая работа [564,3 K], добавлен 09.05.2012Общие сведения об алгоритмах. Свойство и этапы построения алгоритма. Нисходящее проектирование программ. Основные алгоритмические структуры. Принципы структурной алгоритмизации. Массивы случайных чисел. Ввод исходных данных. Определение и вывод данных.
методичка [435,3 K], добавлен 09.12.2014Описание основных уязвимостей технологии передачи информации Wi-Fi: атаки, угрозы криптозащиты, анонимность. Принципы и методы обеспечения безопасности беспроводных сетей. Технологии целостности и конфиденциальности передаваемых через сеть данных.
контрольная работа [539,3 K], добавлен 25.12.2014История алгоритмов симметричного шифрования (шифрования с закрытым ключом). Стандарты на криптографические алгоритмы. Датчики случайных чисел, создание ключей. Сфера интересов криптоанализа. Системы электронной подписи. Обратное преобразование информации.
краткое изложение [26,3 K], добавлен 12.06.2013Программа на языке Turbo Pascal для шифрования данных с помощью шифра Тритемиуса. Входные, выходные данные. Схема алгоритма и текст программы. Порядок ввода исходных данных и описание получаемых результатов. Тестовых задания и анализ их функционирования.
курсовая работа [4,0 M], добавлен 06.01.2011Шифрование как метод защиты информации. История развития криптологии. Классификация алгоритмов шифрования, симметричные и асимметричные алгоритмы. Использование инструментов криптографии в Delphi-приложениях. Краткая характеристика среды Delphi 7.
курсовая работа [48,5 K], добавлен 19.12.2009