#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";
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