void RSA::cryptRSA (char* fileMText,char* fileKey,char *fileCrypt) { string headCode="1000010010000100";/*head16bit*/ ifstream filetext(fileMText); ifstream filekey(fileKey); ofstream filecrypt(fileCrypt); if(!filetext){ cout<<"Fail!Filetext isn't exist"; return; } if(!filekey){ cout<<"Fail!Filekey isn't exist"; return; } /*read key from fileKey*/ string TEXT; ZZZ n,e; filekey>>TEXT; n=TEXT; filekey>>TEXT; e=TEXT; /*linked head16bit with bit random + KEY{128,192,256}*/ TEXT=headCode; ZZ numbersite; RandomBits(numbersite,(2032-KEY)); stringstream buffer; buffer<<numbersite; ZZZ code; code=buffer.str(); int strlen=code.get_str(2).length(); for(;strlen<2032-KEY;strlen++)TEXT+='1'; TEXT+=code.get_str(2); filetext>>headCode; code=headCode; TEXT+=code.get_str(2); /*********************/ /*C=M^e mod n*/ code.set_str(TEXT,2); mpz_powm(code.get_mpz_t(),code.get_mpz_t(),e.get_mpz_t(),n.get_mpz_t()); filecrypt<<convert_base64(code.get_str(2))<<endl; filecrypt.close(); filetext.close(); filekey.close(); }
void RSA::createNewKey(char *filePrivateKey,char * filePublicKey) { PrGlib dnthang; ofstream PK(filePrivateKey); ofstream BK(filePublicKey); /*Generate p and q as strong primes */ ZZZ p=dnthang.PrG_generate_strong_prime(3072); ZZZ q=dnthang.PrG_generate_strong_prime(3072); ZZZ n=q*p; ZZZ phi=(p^1)*(q^1); ZZZ e,k; /*Find e such that gcd(e,phi)=1*/ do { gmp_randclass rr(gmp_randinit_default); rr.seed(time(NULL)); e =rr.get_z_bits(dnthang.PrG_get_length()); ZZZ num = e & 1; if (num == 0)e = e | 1; mpz_gcd (k.get_mpz_t(),e.get_mpz_t(), phi.get_mpz_t()); }while(k!=1); /*******************************/ /*Compute d= e^-1 mod n*/ ZZZ d; mpz_invert(d.get_mpz_t(),e.get_mpz_t(),phi.get_mpz_t()); /*private key*/ PK<<n.get_str()<<endl; PK<<d.get_str()<<endl; /*public key*/ BK<<n.get_str()<<endl; BK<<e.get_str()<<endl; PK.clear(); PK.close(); BK.clear(); BK.close(); }