//--------------------------------------------------------------------------- #include #pragma hdrstop extern "C" { #include "miracl.h" } //#include //#include #include #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; miracl *mip=mirsys(5000,10); //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void GenPrimes(big a, big b, int BITS) { csprng RNG; strong_init(&RNG,1,"a",GetTickCount()); //Generate Prime 1 strong_bigdig(&RNG,BITS,10,a); if(subdivisible(a,2)) { incr(a,1,a); } while(!isprime(a)) { incr(a,2,a); //cotnum(a,stdout); } //Generate Prime 2 strong_bigdig(&RNG,BITS,10,b); if(subdivisible(b,2)) { incr(b,1,b); } while(!isprime(b)) { incr(b,2,b); } } //Generates F which is (P-1)(Q-1) void GenF(big p, big q, big f) { big p1=mirvar(0),q1=mirvar(0); decr(p,1,p1); decr(q,1,q1); multiply(p1,q1,f); } //Generates number E for RSA encryption. //Number is BITS long and requires an F void GenE(big f, big e, int BITS) { csprng RNG; big x=mirvar(0); big z=mirvar(0); convert(1,x); strong_init(&RNG,1,"a",GetTickCount()); strong_bigdig(&RNG,BITS/2,10,e); //cotnum(e,stdout); if(subdivisible(e,2)) { //cotnum(e,stdout); incr(e,1,e); } //cotnum(z,stdout); egcd(f,e,z); while(compare(z,x)!=0) { incr(e,2,e); egcd(f,e,z); //cotnum(e,stdout); } } //Generates D. don't quite know how. Requires a variable to store it //D and requres E and number F void GenD(big d,big e, big f) { copy(e,d); xgcd(d,f,d,d,d); } void RSAEnc(big plaintext, big e, big p, big q, big cyphered) { big pq = mirvar(0); multiply(p,q,pq); powmod(plaintext,e,pq,cyphered); } void RSADec(big t, big e, big p, big q, big w) { big pq = mirvar(0); multiply(p,q,pq); powmod(t,e,pq,w); } void __fastcall TForm1::Button1Click(TObject *Sender) { int BITS=2048; BITS=ceil((BITS)*log10(2.0)/2); //2048/log[2](10) = number of digits in a 2048 bit number. char *nump; char *numq; big p,q,f,p1,q1,e,d,n,w,l; char *nick; String A; nick = (char*)malloc(258); p=mirvar(0); q=mirvar(0); f=mirvar(0); e=mirvar(0); d=mirvar(0); n=mirvar(0); w=mirvar(0); l=mirvar(0); convert(695,n); nump = new char[256+1]; numq = new char[256+1]; GenPrimes(p,q,BITS); big_to_bytes(257,p,nump,false); big_to_bytes(257,q,numq,false); cotstr(p,nick); A=nick; Form1->Memo1->Text = A; cotstr(q,nick); A=nick; Form1->Memo2->Text = A; //printf("P="); //cotnum(p,stdout); //printf("Q="); //cotnum(q,stdout); GenF(p,q,f); cotstr(f,nick); A=nick; Form1->Memo3->Text = A; GenE(f,e,BITS); cotstr(e,nick); A=nick; Form1->Memo4->Text = A; GenD(d,e,f); cotstr(d,nick); A=nick; Form1->Memo5->Text = A; RSAEnc(n,e,p,q,w); //printf("Cipher="); //cotnum(w,stdout); RSADec(w,d,p,q,l); //printf("Plaintext="); //cotnum(l,stdout); } //---------------------------------------------------------------------------