Arhiva pentru noiembrie, 2008

h1

ElGamal

noiembrie 8, 2008
#include<stdio.h>
#include<iostream>

#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”.