Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Домашка.doc
Скачиваний:
2
Добавлен:
21.07.2019
Размер:
54.78 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ

Кафедра «Вычислительные машины, комплексы системы и сети»

Домашняя работа

по предмету: «Методы и средства защиты компьютерной информации»

на тему: «Реализация шифра RSA»

Выполнил:

Студент 4 курса

дневного отделения

факультет ИТ спец. 230101

группа ИТ-4

Добромыслов Владислав Викторович

Преподаватель:

Орлов Валентин Александрович

Москва – 2011 г.

  1. Цель работы.

Целью данной домашней работы является написание утилит:

  • решение задачи факторизации натурального числа

  • шифрование / расшифровывание нормализованного текста при помощи алгоритма RSA.

Исходные данные варианта: открытый ключ для алгоритма шифрования следующий:

< e=17, n=64507 >

  1. Факторизация натурального числа.

Порядок следования аргументов командной строки:

factorization.exe e n

argv[0] – имя утилиты;

argv[1] – целое число такое, что НОД(Pi-1,E)=1, где Pi – простые числа (разложение числа n);

argv[2] – целое число - модуль, используемый в алгоритме RSA.

Исходный код:

#include <iostream.h>

#include <conio.h>

#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#include <io.h>

#include <math.h>

#define ulong unsigned long

#define uchar unsigned char

ulong get_d(ulong n,ulong e)

{

ulong d=0;

ulong i,j;

uchar *arrN=new uchar[n];

for(i=0;i<n;i++)

arrN[i]=1;

ulong sN=(ulong)sqrt(n);

for(i=2;i<sN;i++)

{

if(arrN[i])

for(j=2*i;j<n;j+=i)

arrN[j]=0;

}

ulong resN=n;

ulong *arrRes=new ulong[resN];

for(i=2,j=0;i<n;i++)

if(arrN[i])

arrRes[j++]=i;

resN=j;

ulong p=-1,q=-1;

for(i=0;i<resN;i++)

{

for(j=0;j<resN;j++)

{

if(i==j)

continue;

if(arrRes[i]*arrRes[j]==n)

{

p=arrRes[i];

q=arrRes[j];

break;

}

}

if(p!=-1 && q!=-1)

break;

}

ulong m=(p-1)*(q-1);

for(i=2;i<=m;i++)

{

if((e*i)%m==1)

{

d=i;

break;

}

}

cout << "e = " << e << endl;

cout << "n = " << n << endl;

cout << "\np = " << p << endl;

cout << "q = " << q << endl;

cout << "d = " << d << endl;

delete[] arrN;

delete[] arrRes;

return d;

}

int main(int argc,char *argv[])

{

clrscr();

if(argc==3)

{

get_d(atol(argv[2]),atol(argv[1]));

getch();

}

else

{

cout << "Command line has ERORR!" << endl;

getch();

exit(1);

}

return 0;

}

  1. Шифрование/расшифровывание при помощи алгоритма rsa.

Порядок следования аргументов командной строки:

шифрования/ расшифровывания:

rsa.exe e E N InTxt.txt OutTxt.txt

argv[0] – имя программы;

argv[1] – опция – шифрование/ расшифровывание;

argv[2] – целое число такое, что НОД(Pi-1,E)=1, где Pi – простые числа (разложение числа N);

argv[3] – целое число - модуль, используемый в алгоритме RSA;

argv[4] – имя входного файла (нормализованный текст);

argv[5] – имя выходного файла (шифрованный текст).

Исходный код:

#include <iostream.h>

#include <conio.h>

#include <windows.h>

#include <stdlib.h>

#include <stdio.h>

#include <io.h>

#include <math.h>

#define ulong unsigned long

#define uchar unsigned char

ulong pow_f(ulong a,ulong b,ulong n)

{

ulong res=1;

while(b!=0)

{

if(b&1)

res=(res*a)%n;

b>>=1;

a=(a*a)%n;

}

return res;

}

void rsa_e(ulong e,ulong n,char *inPath,char *outPath)

{

FILE *inFile,*outFile;

int i,j,handleIn,handleOut,val;

uchar *arrText,*arrTextOut;

int sizeText,newSizeText,sizeTextOut;

uchar code_A=192,sizeABC=32;

ulong M=0,C=0;

inFile = fopen(inPath,"r");

handleIn=fileno(inFile);

sizeText=filelength(handleIn);

if(sizeText%3==0)

newSizeText=sizeText;

else

newSizeText=sizeText+3-(sizeText%3);

arrText=new char[newSizeText];

read(handleIn,arrText,sizeText);

fclose(inFile);

randomize();

for(i=0;i<sizeText;i++)

arrText[i]-=code_A;

for(;i<newSizeText;i++)

arrText[i]=rand()%sizeABC;

sizeTextOut=(int)(newSizeText*4/3);

arrTextOut=new uchar[sizeTextOut];

for(i=0,j=0;i<newSizeText;i+=3,j+=4)

{

M=0;

M+=((ulong)arrText[i+0])<<0;

M+=((ulong)arrText[i+1])<<5;

M+=((ulong)arrText[i+2])<<10;

C=pow_f(M,e,n);

arrTextOut[j+0]=(uchar)((C>>0)&15|(rand()%2<<4)+code_A);

arrTextOut[j+1]=(uchar)((C>>4)&15|(rand()%2<<4)+code_A);

arrTextOut[j+2]=(uchar)((C>>8)&15|(rand()%2<<4)+code_A);

arrTextOut[j+3]=(uchar)((C>>12)&15|(rand()%2<<4)+code_A);

}

outFile = fopen(outPath,"wb");

handleOut=fileno(outFile);

write(handleOut,arrTextOut,sizeTextOut);

fclose(outFile);

delete[] arrText;

delete[] arrTextOut;

}

void rsa_d(ulong d,ulong n,char *inPath,char *outPath)

{

FILE *inFile,*outFile;

int i,j,handleIn,handleOut,val;

uchar *arrText,*arrTextOut;

int sizeText,sizeTextOut;

uchar code_A=192,sizeABC=32;

ulong M=0,C=0;

inFile = fopen(inPath,"r");

handleIn=fileno(inFile);

sizeText=filelength(handleIn);

arrText=new char[sizeText];

read(handleIn,arrText,sizeText);

fclose(inFile);

for(i=0;i<sizeText;i++)

arrText[i]-=code_A;

sizeTextOut=(int)(sizeText*3/4);

arrTextOut=new uchar[sizeTextOut];

for(i=0,j=0;i<sizeText;i+=4,j+=3)

{

C=0;

C+=(((ulong)arrText[i+0])&15)<<0;

C+=(((ulong)arrText[i+1])&15)<<4;

C+=(((ulong)arrText[i+2])&15)<<8;

C+=(((ulong)arrText[i+3])&15)<<12;

M=pow_f(C,d,n);

arrTextOut[j+0]=(uchar)((M>>0)&(sizeABC-1))+code_A;

arrTextOut[j+1]=(uchar)((M>>5)&(sizeABC-1))+code_A;

arrTextOut[j+2]=(uchar)((M>>10)&(sizeABC-1))+code_A;

}

outFile = fopen(outPath,"w");

handleOut=fileno(outFile);

write(handleOut,arrTextOut,sizeTextOut);

fclose(outFile);

delete[] arrText;

delete[] arrTextOut;

}

int main(int argc,char *argv[])

{

clrscr();

if(argc==6)

{

if(argv[1][0]=='e')

{

rsa_e(atol(argv[2]),atol(argv[3]),argv[4],argv[5]);

}

else if(argv[1][0]=='d')

{

rsa_d(atol(argv[2]),atol(argv[3]),argv[4],argv[5]);

}

else

{

cout << "Command line has ERORR!" << endl;

getch();

exit(1);

}

}

else

{

cout << "Command line has ERORR!" << endl;

getch();

exit(1);

}

return 0;

}