ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ
Кафедра «Вычислительные машины, комплексы системы и сети»
Домашняя работа
по предмету: «Методы и средства защиты компьютерной информации»
на тему: «Реализация шифра RSA»
Выполнил:
Студент 4 курса
дневного отделения
факультет ИТ спец. 230101
группа ИТ-4
Добромыслов Владислав Викторович
Преподаватель:
Орлов Валентин Александрович
Москва – 2011 г.
Цель работы.
Целью данной домашней работы является написание утилит:
решение задачи факторизации натурального числа
шифрование / расшифровывание нормализованного текста при помощи алгоритма RSA.
Исходные данные варианта: открытый ключ для алгоритма шифрования следующий:
< e=17, n=64507 >
Факторизация натурального числа.
Порядок следования аргументов командной строки:
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;
}
Шифрование/расшифровывание при помощи алгоритма 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;
}