Exemple #1
0
void PrGlib::PrG_preprocess()
{
	int j = 1;
	while (j<1000) {
		ZZZ p = PrG_prime_sample[j++];
		ZZZ r = this->PrG_number%p;
		for (ZZZ i = p - r; i < PrG_sieve_size; i += p)
		{
			this->PrG_bitGet->at(i.get_ui()) = true;
		}
	}
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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();
}
Exemple #5
0
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();
}