Автор работы: Пользователь скрыл имя, 10 Сентября 2013 в 18:47, курсовая работа
1. Программно реализовать на языке C++ алгоритм шифрования и дешифрования сообщения c помощью метода в соответствии с вариантом. Номер варианта k определяется по формуле: k=N mod 3, где N – номер студента в журнале.
k
Метод
0
Шифр Шамира
1
Шифр Эль-Гамаля
2
Шифр RSA
1.Содержание…………………………………………………………..2
2.Задание………………………………………………………………..3
3.Програмный код……………………………………………………...4
4. Описание переменных и функций………………………………....10
Федеральное агентство связи
Государственное образовательное учреждение высшего профессионального образования
«Сибирский государственный университет телекоммуникаций
и информатики»
(ГОУ ВПО «СибГУТИ»)
“Криптография”
Выполнил: студент
гр.№ РИ-17
Яковлев Дмитрий
Сергеевич
Проверил:
Приставка Павел
Анатольевич
Новосибирск – 2012
Содержание
1.Содержание………………………………………………
2.Задание………………………………………………………
3.Програмный код……………………………………………………...4
4. Описание переменных и функций………………………………....10
Задание
1. Программно реализовать на языке C++ алгоритм шифрования и дешифрования сообщения c помощью метода в соответствии с вариантом. Номер варианта k определяется по формуле: k=N mod 3, где N – номер студента в журнале.
k |
Метод |
0 |
Шифр Шамира |
1 |
Шифр Эль-Гамаля |
2 |
Шифр RSA |
2. Программно реализовать на языке C++ алгоритм электронной подписи сообщения и проверки его подлинности c помощью метода в соответствии с вариантом. Номер варианта k определяется по формуле: k=N mod 2, где N – номер студента в журнале.
k |
Метод |
0 |
Электронная подпись RSA |
1 |
Электронная подпись на базе шифра Эль-Гамаля |
Вариант №23
Программный код
#include <conio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
int prost (int P){
int n=0;
for(int i=2;i<P/2;i++){
if (P%i==0) {n=1;
break;}
}
return n;
}
int st (int t1, int t2, int t3)
{
int y;
y=1;
while (t2>0){
if (t2&1==1)
y=(y*t1)%t3;
t2>>=1;
t1=(t1*t1)%t3;
}
return y;
}
int Evklid_1(int d,int f){
int temp;
while(d!=0){
temp=f%d;
f=d;
d=temp;
}
return f;
}
int Evklid_2(int d,int f){
int U1,V1,U3,V3,T1,T3,q;
U1=f;U3=0;V1=d;V3=1;
while (V1!=0){
q=U1/V1;
T1=U1%V1;T3=U3-q*V3;
U1=V1;U3=V3;V1=T1;V3=T3;
}
while (U3<0) U3=U3+f;
return U3;
}
int power (int m,int d,int N){
int result=1;
while (d>0){
if (d&1==1) result=result*m%N;
d>>=1;
m=m*m%N;
}
return result;
}
int main()
{
int N,P,Q,f,c,d,m,n,NN,e,M;
int p,g,x,y,r,u,s,h,q,k1,z,kk,ll;
srand(time(NULL));
do{
P=(rand()%20)+10;
n=prost(P);
}while (n==1);
do{
Q=(rand()%20)+10;
n=prost(Q);
}while (n==1||Q==P);
N=P*Q;
cout<<"*****Shifr RSA*****"<<endl;
cout<<endl;
cout<<"Dannye,dlja Shifra:"<<endl;
cout<<"P="<<P<<" "<<"Q="<<Q<<" "<<"N="<<N<<endl;
f=(P-1)*(Q-1);
do{
d=(rand()%(f))+3;
n=Evklid_1(f,d);
}while (n!=1);
c=Evklid_2(d,f);
cout<<"f="<<f<<" "<<"d="<<d<<" "<<"c="<<c<<endl;
cout<<"Vvedite Soobchenie:"<<endl;
cin>>m;
if (m<N){
e=power(m,d,N);
M=power(e,c,N);
cout<<"e="<<e<<endl;
cout<<"M="<<M<<endl;
if (m==M) cout<<"Chifr sovpadaet"<<endl;
else cout<<"Failed!"<<endl;
system("pause");
}
do{
p=(rand()%100)+50;
n=prost(p);
q=(p-1)/2;
g=0;
while(st(g,q,p)==1||g<=0||g>=
{
g=rand()%(p-1);
}
cout<<endl;
cout<<"*****Podpis El-Gamal*****"<<endl;
cout<<endl;
h=(rand()%100)+50;
do
{
x=rand()%(p-1);
}
while((x>(p-1) || x<1) && (h>p || h<1));
while ((z*k1)%(p-1)!=1)
{
k1=rand()%(p-2);
z=1/k1;
}
y=st(g,x,p);
r=st(g,z,p);
u=(h-x*r)%(p-1);
if(u<0)
u+=p-1;
s=(z*u)%(p-1);
kk=(st(y,r,p)*st(r,s,p))%p;
ll=st(g,h,p);
cout<<"Dannye,dlja Shifra:"<<endl;
cout<<"Sekretnyy kluch:"<<" "<<x<<endl;
cout<<"p="<<p<<" "<<"g="<<g<<" "<<"Otkrutiy kluch(y)="<<y<<endl;
cout<<"kk="<<kk<<" "<<"ll="<<ll<<"-Sravnenie chisel"<<endl;
if((st(y,r,p)*st(r,s,p))%p==
cout<<"Podpis' verna!"<<endl<<endl<<endl;
else cout<<"Podpis' ne verna!"<<endl;
system("pause");
return(0);
}
while (getch());
}
Описание основных переменных и функций
int prost (int P) – определяет простое число или нет
int st (int t1, int t2, int t3) – алгоритм быстрого возведения в степень
int Evklid_1(int d,int f) – алгоритм Евклида(определяет наибольший общий делитель)
int Evklid_2(int d,int f) – обобщенный алгоритм Евклида(для нахождения инверсии числа)
srand(time(NULL)) – инициализация рандомизатора чисел
Шифр RSA:
N – открытый ключ(N=P*Q)
P – большое простое число
Q – большое простое число
c – секретный ключ
d – открытый ключ
m – шифруемое сообщение
e – зашифрованное сообщение
M – расшифрованное сообщение
Электронная подпись RSA:
p – большое простое число
g – большое простое число меньшее p
h – хеш функция
x – секретный ключ
y – открытый ключ
ll – правая часть
kk– левая часть