bool PrGlib::PrG_prime_test(const ZZZ& n,unsigned int len) { /*kiem tra gia nguyen to fermat co so */ ZZZ tmp; mpz_powm(tmp.get_mpz_t(), ZZZ(2).get_mpz_t(),ZZZ((n - 1)).get_mpz_t(), n.get_mpz_t()); if (tmp != 1) return false; /**************************************/ /*let k and m such that: n-1=m*2^k*/ ZZZ m = n^1; //sub(m, n, 1); because n is odd long k; // MakeOdd(m); k = 0; do{ m >>= 1; //= > m = m / 2; //y = m & 1; //check m is even number k++; } while ((m & 1) == 0); /*check prime number with the first 20 prime numbers*/ gmp_randclass r(gmp_randinit_default); ZZZ x; for (int i = 0; i < 20; i++) { x = PrG_prime_sample[i]; if (PrG_rabin_miller_test(n, x, k, m))return false; } /*check prime number with the random 44 numbers <= sqrt(n)*/ ZZZ qk; mpz_sqrt(qk.get_mpz_t(),n.get_mpz_t()); for (int i = 0; i < len; i++) { do { x= r.get_z_range(qk); //RandomBnd(x, n); } while (x <= 73); if (PrG_rabin_miller_test(n, x, k, m))return false; } return true; }
bool PrGlib::PrG_rabin_miller_test(const ZZZ& n, const ZZZ& x, long &k, const ZZZ&m) { ZZZ z,y; //z = modulo(x, m, n); mpz_powm(z.get_mpz_t(),x.get_mpz_t(),m.get_mpz_t(),n.get_mpz_t()); if (z == 1 || z == (n^1)) return 0; long j=0; do { y = z; //z=y*y%n; mpz_powm_ui(z.get_mpz_t(),y.get_mpz_t(),2,n.get_mpz_t()); j++; } while (j < k && z != 1); return (z != 1 || y != (n^1))?true:false; }
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(); }