Криптография

Автор работы: Пользователь скрыл имя, 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

Файлы: 1 файл

Kursovik_Informatika.docx

— 29.91 Кб (Скачать файл)

Федеральное агентство связи

Государственное образовательное  учреждение высшего профессионального  образования

«Сибирский государственный  университет телекоммуникаций

и информатики»

(ГОУ ВПО «СибГУТИ»)

 

 

 

 

 

                                         Курсовая работа

 

“Криптография”

 

 

 

Выполнил: студент 

гр.№  РИ-17

Яковлев Дмитрий

Сергеевич

 

Проверил:

Приставка Павел 

Анатольевич

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Новосибирск – 2012

Содержание

 

 

1.Содержание…………………………………………………………..2

2.Задание………………………………………………………………..3

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

  1. K=23 mod 3=2(Шифр RSA)
  2. K=23 mod 2=1(Электронная подпись на базе шифра Эль-Гамаля)

 

 

 

 

 

 

 

 

 

 

Программный код

#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>=p||g==1)

      {

              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==st(g,h,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– левая часть

 


Информация о работе Криптография