#include<conio.h>
#include<NTL/ZZ.h>
#include<fstream>
using namespace std;
using namespace NTL;
long l,k;
class A
{
ZZ p,q,a,alfa,alfa2,beta,vector2;
unsigned char output[];
public:
A()
{l=0;}
void Key()
{
while(l<20)
l=RandomBnd(200);
cout<<endl<<”l=”<<l;
//generam q
GenGermainPrime(q,l,80);
cout<<endl<<”q=”<<q;
//aflam p
p=2*q+1;
cout<<endl<<”p=”<<p;
//generam a
while(a<1)
a=RandomBnd(q-2);
cout<<endl<<”a=”<<a;
//generam alfa,alfa2 rad primitiva
while(alfa2<2 && PowerMod(alfa2,2,p)!=1 && PowerMod(alfa2,q,p)!=1)
alfa2 = RandomBnd(q-2);
alfa=PowerMod(alfa2,(p-1)/q,p);
cout<<endl<<”alfa=”<<alfa;
//generam beta
PowerMod(beta,alfa,a,p);
cout<<endl<<”beta=”<<beta;
}
ZZ get_p()
{ return this->p; }
ZZ get_q()
{ return this->q; }
ZZ get_alfa()
{ return this->alfa; }
ZZ get_beta()
{ return this->beta; }
void outputText()
{
BytesFromZZ(output,vector2,k);
cout<<endl<<”vector_output=”<<vector2;
cout<<endl<<”output=”<<output;
outputText(“output.txt”);
}
void Decriptare(ZZ gama, ZZ delta)
{
ZZ m,h;
PowerMod(m,gama,a,p);
InvMod(h,m,p);
MulMod(vector2,h,delta,p);
}
void outputText(char *file)
{
/*ofstream on(file, ios::out);
on<<output;
on.close();*/
FILE *outfile=fopen(“output.txt”, “a” );
feof(outfile);
for(int j=0;j<k;j++){
fprintf(outfile,”%c”,output[j]);}
fclose(outfile);
}
};
class B
{
ZZ p,q,alfa,beta,lg,vector,r,delta,gama,z;
long i;
unsigned char input1[1000];
public:
B(A c,char *file)
{
for(int m=0;m<1000;m++) input1[m]=”;
i=0;
p=c.get_p();
q=c.get_q();
alfa=c.get_alfa();
beta=c.get_beta();
inputText(file);
while(input1[0]!=”)
{
k=0;vector=0;
while(NumBits(vector)<NumBits(p)-4 && input1[k]!=”)
{ ZZFromBytes(vector,input1,k); k++;}
genereaza(vector);
c.Decriptare(gama,delta);//a decripteaza textul
c.outputText();//a afiseaza textul
if(input1[k]!=”) {
k–;
for(int h=0;h<1000-k;h++)
input1[h]=input1[h+k];
for(int h=1000-k;h<1000;h++)
input1[h]=”;
}
else {for(int h=0;h<k;h++) input1[h]=”;}
}
/* BUN long k=0;
while(NumBits(vector)<=NumBits(p) && input1[k]!=”)
{ ZZFromBytes(vector,input1,k); k++;}
cout<<endl<<”vector input=”<<input1<<endl;
cout<<endl<<”p*=”<<NumBits(p)<<endl;
cout<<endl<<”v*=”<<NumBits(vector)<<endl;
genereaza();
c.Decriptare(gama,delta);//a decripteaza textul
c.outputText();//a afiseaza textul*/
}
void genereaza(ZZ vector)
{
//generam r
/*while(r<1)
r=RandomBnd(q-2);*/
r=315261752;
cout<<endl<<”r=”<<r;
//generam gama
PowerMod(gama,alfa,r,p);
cout<<endl<<”gama=”<<gama;
//generam omega
PowerMod(z,beta,r,p);
MulMod(delta,vector,z,p);
cout<<endl<<”delta=”<<delta;
}
void inputText(char *file)
{
//citim textul in input1;
ifstream in(file, ios::in);
cout<<endl;
while(!in.eof())
{
in>>input1[i];
i++;
}
i–;
in.close();
}
ZZ get_gama()
{return gama;}
ZZ get_delta()
{return delta;}
ZZ get_vector()
{return vector;}
};
class C
{
ZZ m,h,vector2,p;
unsigned char output[];
public:
C(A c)
{
p=c.get_p();
}
void Decriptare(ZZ gama1, ZZ delta1, ZZ gama2, ZZ delta2, ZZ vector)
{
InvMod(h,delta1,p);
MulMod(m,h,delta2,p);
MulMod(vector2,vector,m,p);
}
void outputText()
{
BytesFromZZ(output,vector2,36);
cout<<endl<<”vector_output=”<<vector2;
cout<<endl<<”output=”<<output;
}
};
void main()
{
A a; //cel care primeste ..
a.Key();//se genereaza cheia publica si cheia privata
B b(a,”input.txt”);//cel care trimite .. va lua cheia publica a celui caruia trebuie sa ii trimita mesajul
cout<<endl<<endl<<”****************** ATAC ***************************”<<endl;
B d(a,”input2.txt”);
C c(a);
c.Decriptare(b.get_gama(),b.get_delta(),d.get_gama(),d.get_delta(),b.get_vector());
c.outputText();
_getch();
}
Fisiere:
- input.txt : advwqgasghvdhavgdacwwqvdsgdhvahdvawy
- input2.txt
Atac pentru acelasi “r”.
