!! RSA !! Public Key Cryptography
#include <stdio.h> #include <stdlib.h> #include <math.h> int mrpt(int n)//miller robbin primility test { int s,t,x,i; if(n > 2) { if(n%2==0) return 0; else { int temp=1; s=0; t=n-1; while(t%2==0) { s=s+1; t=t/2; } x=0; while(x==0) x=rand()%(n-1); //printf("x==%d\n",x); for(i=1;i < =t;i++) { //calculate x't mod n=temp temp=(temp*x)%n; } //printf("x't mod n==%d\n",temp); int i,stemp=1,pow=1; for(i=1;i<=s;i++) { pow=pow*2; } for(i=1;i<=pow;i++) { stemp=(stemp*temp)%n; } if(stemp==1) return 1; else return 0; } } else return 0; } int gcd(int a,int b)//compute gcd of a,b { if(b==0) return a; gcd(b,a%b); } int main() { int i, num[2],p=5,q,phn,n,e,d; time_t t; //change base value and fix range of p and q int base=100; printf(" ______________\n| RSA |\n ---------- ----\nGenerate prime Nums in range 1 to %d\n",base); //generate random numbers p and q srand((unsigned) time(&t)); for(i=0;i<2;i++) { while(1){ num[i]=rand()%base; if(mrpt(num[i])&num[i]!=p) break;} p=num[i]; } //choose p,q as large distinct prime number p=num[0]; q=num[1]; printf("\np is : %d\nq is : %d\n",p,q); //calculate phy(n)=p-1*q-1; phn=(p-1)*(q-1); printf("phy(n) : %d \n",phn); //calculate n=p*q; n=p*q; printf("n is : %d \n",n); //choose e such that 1<e<phn and gcd(e,phn)=1 while(gcd(phn,e)!=1) e=rand()%phn; printf("e is : %d\n",e); //compute d such as multiplicative inverse of e.d=1mod phn for(i=1;(phn*i+1)%e!=0;i++); d=(phn*i+1)/e; printf("d is : %d\n",d); //publish (N,e) as public key //keep (p,q and d) secreatly printf("\nPublic key (N,e) :( %d,%d )\n",n,e); printf("Secreat key (p,q,d) :( %d,%d,%d )\n",p,q,d); printf("Thanks !! End of program !!\n"); return(0); }
Compile By : gcc -o a rsa.c (In LINUX environment)
run : ./a
Special thanks : Sunil_Kumar
Thank you for sight !