//---------------------------------------------------------------------------#include <vcl.h>#pragma hdrstopextern "C"{ #include "miracl.h"}//#include <stdio.h>//#include <windows.h>#include <math.h>#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 Fvoid 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);}//---------------------------------------------------------------------------