📄 elgamal.c
字号:
#include<stdio.h>#include"lip.h"#include<time.h>/*public key=(p,g,k); private key=(p,g,a);*/long nbtest=120;void xrand(verylong seed,verylong *b){ verylong temp=0; zintoz((long)69069,b); verylong c=0; zintoz((long)5,&c); zintoz((long)10,&temp); verylong min=0; verylong max=0; int i; i=1; zsexp(temp,(long)207,&min);// zwriteln(min); zsexp(temp,(long)208,&max); zone(&temp);// zwriteln(temp); zsub(max,temp,&max);// zwriteln(max); while(i==1){ zmul(*b,seed,&temp); zadd(temp,c,b); i=zcompare(min,*b); } i=zcompare(max,*b); do{ zsdiv(*b,(long)10,b); i=zcompare(max,*b); }while(i!=1); i=z2mod(*b); if(i==0){ zsadd(*b,1,b); }/* printf("Seed: "); zwriteln(seed);*/ return ;}void xfindprime(verylong *b){ long i=0; verylong add2=0; zintoz((long)2,&add2); while(i==0){ zadd(add2,*b,b); i=zprobprime(*b,nbtest); } return ;}void encryptMesg(verylong p,verylong g,verylong k, verylong mesg,verylong *gamma,verylong *delta){ verylong e=0; verylong seed=0; verylong temp=0; zintoz(12345,&seed); time_t start;/* printf("\nEncrypting message : \n\tEnter seed : "); zread(&seed);*/ time(&start); long t=0; t=(long)start; printf("\nencrypting seed %lu : ",t); zintoz(t,&seed); zrstart(seed); zrandomprime(50,nbtest,&e,zrandomb); printf("\ne: "); zwriteln(e); zexpmod(g,e,p,gamma); zexpmod(k,e,p,&temp); zmulmod(temp,mesg,p,delta);}void decryptMesg(verylong p,verylong g,verylong a,verylong gamma,verylong delta,verylong *text){ verylong temp=0; verylong one=0; verylong interm=0; zone(&one); zsub(p,a,&temp); zsub(temp,one,&temp); zexpmod(gamma,temp,p,&interm); zmulmod(interm,delta,p,text);}int main(){ verylong seed=0; verylong random=0; verylong prime=0; verylong g=0; verylong a=0; verylong k=0; verylong mesg=0; verylong gamma=0; verylong delta=0; verylong text=0; time_t start,end; /*generator , g=2; */ zintoz(2,&g); time(&start); long t=0; t=(long)start; printf("\nseed for generating P : %lu ",t); zintoz(t,&seed); /*Find Random Number*/ xrand(seed,&random); zsadd(random,0,&prime); printf("\nRandom Number : "); zwriteln(random); /*Find prime Number*/ xfindprime(&prime); printf("Prime Number(p): "); zwriteln(prime); time(&end); t=(start-end)*132; printf("\nseed for generating g : %lu \n ",t); zintoz(t,&seed); zrstart(seed); zrandomprime(50,nbtest,&g,zrandomb); printf("(generator)g: "); zwriteln(g); /*Find a*/ time(&end); t=(start*end)/10000; printf("\nseed for generating a : %lu \n ",t); zintoz(t,&seed); zrstart(seed); zrandomprime(50,nbtest,&a,zrandomb); printf("a: "); zwriteln(a); /*Find K*/ zexpmod(g,a,prime,&k); printf("k: "); zwriteln(k); /*Input message*//* printf("\nEnter Number : "); zread(&mesg); printf("\nU have entered : "); zwrite(mesg); encryptMesg(prime,g,k,mesg,&gamma,&delta); printf("\n\tgamma : "); zwrite(gamma); printf("\n\tdelta : "); zwrite(delta); decryptMesg(prime,g,a,gamma,delta,&text); printf("\n\tPlaintext : "); zwrite(text); printf("\n\n");*/ int select=0; while(1){ printf("\nEnter ur choice : "); printf("\n1.Encrypt and decrypt both (1) : "); printf("\n2.Encrypt only (2) : "); printf("\n3.Decrypt only (3) : "); printf("\n4.exit(4) : "); scanf("%d",&select); switch(select){ case 1: printf("\nEnter Number : "); zread(&mesg); printf("\nU have entered : "); zwrite(mesg); encryptMesg(prime,g,k,mesg,&gamma,&delta); printf("\n\tgamma : "); zwrite(gamma); printf("\n\tdelta : "); zwrite(delta); decryptMesg(prime,g,a,gamma,delta,&text); printf("\n\tPlaintext : "); zwrite(text); printf("\n\n"); break; case 2 : printf("\nEnter Number : "); zread(&mesg); printf("\nU have entered : "); zwrite(mesg); encryptMesg(prime,g,k,mesg,&gamma,&delta); printf("\n\tgamma : "); zwrite(gamma); printf("\n\tdelta : "); zwrite(delta); printf("\n\n"); break; case 3: printf("Enter gamma : "); zread(&gamma); printf("Enter delta : "); zread(&delta); decryptMesg(prime,g,a,gamma,delta,&text); printf("\n\tPlaintext : "); zwrite(text); printf("\n\n"); break; case 4: printf("\n\n"); return 0; default: printf("Please enter correct option."); } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -