You are on page 1of 3

#include<iostream.

h>
#include<iomanip.h>
const int nn=2000;
int IsPrim( int n){
int i, ePrim = 1;
for(i = 2; i <= n/2; i++)
{
if(n%i == 0)
{
ePrim = 0;
break;
}
}
return ePrim;
}
int cmmdc(int a, int b){ //cel mai mare divizor comun
if (a == 0)
return b;
return cmmdc(b%a, a);
}
int ModInverse( int a, int m){ //inversul lui a, mod m //m-prim
int ePrim, x = 0;
ePrim=IsPrim(m);
if(ePrim==1) ePrim = cmmdc(a, m);
if (ePrim != 1){
cout << "Inversul nu exista";
return 0;
}else{
a = a%m;
for (x=1; x<m; x++)
if ((a*x) % m == 1) break;
}
return x;
}
int mPowMod(int baza, int expon, int modulo) {
if ((baza<1)||(expon<0)||(modulo<1)) {
return -1;
}
int i, rez=1;//exponent=0
for(i = 1; i <=expon; i++){
rez=(rez*baza)%modulo;
}
return rez;
}
int mMod(int a, int m) {
int r=-1;
if(a>0 && m>0){
r=a % m;
}
return r;
}
int main()
{
srand(time(NULL));//initializare rand
char sTmp[nn]="";//sir de caractere temporar
int i, j, k;//variabile de contor
//P1. Definim alfabetul Al
char Al[nn]=" ";
cout<<"Introdu alfabetul cu litere MARI: ";
cin.getline(Al,nn,'\n');
int n=strlen(Al);
cout<<"n= "<<n<<endl;
//P2. Determinãm p>n-prim
int p;
cout<<"p= ";cin>>p;
//P3. Determinãm g-generatorul
int g;
cout<<"g= ";cin>>g;
//P4. Determinãm numarul aliator x
int x;
cout<<"Din intervalul [1, "<<p-1<<"] un numar pentru cheia privata x= ";cin>>x;
//P5. Determinãm y
int y;
y=mPowMod(g, x, p);//hash functia
cout<<"y= "<<y<<endl;
//P6. Mesajul
char M[nn]=" ";
cout<<endl;
cout<<"Introdu mesajul cu litere MARI: ";
cin.getline(M,nn,'\n');
cin.getline(M,nn,'\n');
//P7. Criptare
cout<<"\nCRIPTARE\n";
y=mPowMod(g, x, p);//hash functia
cout<<"Cheia publica (y, g, p) = ("<<y<<", "<<g<<", "<<p<<")\n";
cout<<"Se va cripta mesajul: "<<M<<"\n";
int m=strlen(M);
int c1[nn], c2[nn];
int cod;
for(i = 0; i < m; i++)
{
k= 1 + rand() % ( p - 1);
cod=0;
for(j = 0; j < n; j++){
if(M[i]==Al[j]){
cod=j+1;
break;
}
}
c1[i]=mPowMod(g, k, p);
c2[i]=mMod(cod*mPowMod(y, k, p),p);
cout<<"k = "<<k<<"; "<<M[i]<<" = (a, b) = ("<<g<<"^"<<k<<" mod "<<p<<",
"<<cod<<"*"<<y<<"^"<<k<<" mod "<<p<<")= ";
cout<<"("<<c1[i]<<", "<<c2[i]<<")"<<endl;
}
cout<<"Mesajul criptat este: \n";
for(i = 0; i <m; i++){
cout<<"("<<setw(3)<<c1[i]<<", "<<setw(3)<<c2[i]<<")";
}
//P8. Decriptare
int f, M2[nn];
cout<<"\n\nDECRIPTARE\n";
cout<<"Cheia publica (y, g, p) = ("<<y<<", "<<g<<", "<<p<<")\n";
cout<<"Cheia privata x = "<<x<<"\n";
for(i = 0; i < m; i++)
{
y=mPowMod(c1[i], x, p);
f=ModInverse(y ,p);
M2[i]=mMod(c2[i]*f, p)-1;
M[i]=Al[M2[i]];
cout<<"("<<c1[i]<<", "<<c2[i]<<")= "<<c2[i]<<"*(("<<c1[i]<<"^"<<x<<")^(-1)) mod "<<p<<" = ";
cout<<c2[i]<<"*"<<f<<" mod "<<p<<" = "<<M[i]<<endl;
}
M[m]='\0';
cout<<"Mesajul decriptat este: "<<M<<"\n";
return 0;
}

You might also like