Rabu, 28 September 2016

Program C++ untuk Enkripsi Algoritma RSA dengan CRT


#include <iostream.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>

long int p,q,n,r,t,i,s,flag,e[100],d[100],temp[100],j,m[100],en[100],x,y;
char kata[100];
int prime(long int);
void ce();
long int cd(long int);
void encrypt();
int hitmod(int a,int b,int n);
int phi(int n);
int GCD(int x,int y);

void main()
{cout<<":::::::::::::::::::Chinese Remainder Theorem:::::::::::::::::::"<<endl<<endl;
 cout<<"\n Masukkan bilangan prima p : ";
 cin>>p;
 flag=prime(p);
  if(flag == 0)
  {cout<<"\n inputan anda salah \n";
   exit(1); }



 cout<<"\n Masukkan bilangan prima q : ";
 cin>>q;
 flag=prime(q);
  if(flag == 0 || p == q)
  {cout<<"\n inputan anda salah \n";
   exit(1); }

 n=p*q;
 cout<<"\n Diperoleh bilangan n = "<<n<<endl;

 cout<<"\n Masukkan kata : ";
 fflush(stdin);
 cin>>kata;

    for(i=0;kata[i] != NULL;i++)
       m[i]=kata[i];

    hitmod(p,q,n);
    cout<<"\n ::::Hasil CRT:::: \n";
    cout<<"\n Nilai untuk x yang diperoleh adalah : "<<hitmod(p,q,n)<<endl;
    encrypt();

 getch();
}

int prime(long int pr)
{ int i;
 j=sqrt(pr);
 for(i=2;i<=j;i++)
 {  if(pr%i == 0)
   return 0; }
  return 1; }

long int cd(long int x)
{ long int k = 1;
 while (1)
 {  k=k+t;
  if(k%x == 0)
  return(k/x); } }

void encrypt()
{ long int pt, ct, key = hitmod(p,q,n), k, len;
 i = 0;
 len = strlen(kata);
 while (i != len)
 {  pt=m[i];
  pt=pt-96;
  k=1;
   for(j=0;j<key;j++)
   {    k=k*pt;
    k=k%n;   }
    temp[i]=k;
    ct=k+96;
    en[i]=ct;
     i++;  }
  en[i] = -1;
  cout << "\n Hasil enkripsi : ";
   for (i = 0; en[i] != -1; i++)
    printf("%c", en[i]);
}

int hitmod(int a,int b,int n)
{ int p,q,r;
   p=a%n;
   q=b%phi(n);
   r=pow(p,q);
   r=r%n;
   return r; }

int phi(int n)
{ int i,s=0;
   for (i=1;i<n;i++){
   if (GCD(i,n)==1)
    s++;   }
   return s;}

int GCD(int x,int y)
{ int t,s;
   if (x<y)
{   t=x;
      x=y;
      y=t;   }
   s=x%y;
   while(s!=0)
{    x=y;
      y=s;
      s=x%y;   }
   return y;
}


Output Program


 

                  



Cara Manual

Misal dipilih p= 13 dan q= 23, sehingga diperoleh n=299 dan ɸ(n)=264. Kita ambil e=7, dimana GCD(e, ɸ(n) )= 1.
Diambil pesan : kompleks
Kode ASCII : 107111109112108101107115
Dengan memecah plainteks menjadi 3 digit, diperoleh mi sebagai berikut:
m1= 107                                     m5= 108
m2= 111                                     m6= 101
m3= 109                                     m7= 107
m4= 112                                     m8= 115
Dengan rumus enkripsi c=m7 mod 299, diperoleh :
c1= 172                                      c5= 225
c2= 84                                        c6= 257
c3= 112                                      c7= 172
c4= 44                                        c8= 184

Jadi, diperoleh cipherteks : 172 84 112 44 225 257 172 184



Program c++ untuk RSA
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int a,b,q,j,goprim, m[100], e[100];
long double c[100], n;
char pesan[100];
int prima(int x);
void kuncienkrip();
void enkrip();
void main()
{  int i;
                       goprim = 0;
                       while(goprim==0)
                       { cout<<"Masukkan bilangan prima p : ";
                       cin>>a;
                       goprim = prima(a);
                       if(goprim==0)
                       cout<<"Inputan bukan bilangan prima "<<endl;            }
                       goprim = 0;
                       while(goprim==0||a==b)
                       { cout<<"Masukkan bilangan prima q : ";
                           cin>>b;
                           goprim=prima(b);
                           if(goprim==0||a==b)
                           cout<<"Inputan salah "<<endl;           }
                       cout<<"\nMasukkan pesan yang ingin dienkripsi : ";
                       fflush(stdin);
                       cin>>pesan;
                       for (i=0; pesan[i]!=0;i++)
                       { m[i]=pesan[i];  }
                       n = a*b;
                       q = (a-1)*(b-1);
                       kuncienkrip();
                       cout<<"\nNilai e (kunci enkripsi) : ";
                       for (i=0;i<1;i++)
                       { cout<<e[i+1]<<"\t";    }
                       enkrip();
                       getch();   }
void faktor()
{                     int a, b, f, fktr[100];
                       b=0;
                       for(a=2;a<=f;a++)
                       {  if((f%a)==0)
                           {  fktr[b]=a;
                                       f/=a;
                                       a--;
                                       b++;                 }          }          }
int gcd(int r, int t)
{  int s, x;
                       if(t>r)
                       {             x=r;
                           r=t;
                           t=x;    }
                       s=r%t;
                       while (s!=0)
                       {             r=t;
                           t=s;
                           s=r%t;              }
                       return t;   }

int psy(int m)
{                     int i, pi;
                       pi=0;
                       for(i=0;i<m;i++)
                       {  if(gcd(m,i)==1)
                           pi++;    }
                       return pi;             }
int prima(int x)
{  int i;
                       j = sqrt(x);
                       for(i=2;i<=j;i++)
                       {  if(x%i==0)
                                       return 0;           }
                       return 1;  }
void kuncienkrip()
{  int k, i;
                       k = 0;
                       for (i=2;i<q;i++)
                       {  if((q%i)==0)
                           continue;
                           goprim=prima(i);
                           if(goprim==1 && i!=a && i!=b)
                           {  e[k]=i;
                                       if(goprim>0)
                                                   k++;
                                       if(k==99)
                                                   break;              }          }          }
void enkrip()
{  int l, key=e[1];
                       cout<<endl<<"\nCipherteks : ";
                       for(l=0;m[l]!=0;l++)
                       {             c[l]=fmod((pow(m[l],key)), n);
                                       cout<<c[l]<<" ";          }}

Output Program

 

Hasil yang diperoleh pada cara manual dengan program adalah sama, yaitu
cipherteks : 172 84 112 44 225 257 172 184


*PS: Program ini masih belum sepenuhnya benar (Anissa Ittaqullah)

Tidak ada komentar:

Posting Komentar