private void generateKeys(int keyBitSize) { keyByteSize = keyBitSize / 8; do { // Generate Primes for Q and P // Use Cores parallel, if there are more than 1 if (cores > 1) { do { BigInteger[] primes = getPrimesParallel(keyBitSize); p = primes[0]; q = primes[1]; }while (p.compareTo(q) == 0); } else { do { p = getPrimesParallel(keyBitSize)[0]; q = getPrimesParallel(keyBitSize)[0]; log2ofPQ = java.lang.Math.abs(CryptobyHelper.logBigInteger(p) - CryptobyHelper.logBigInteger (q)); }while (log2ofPQ <= 0.1 || log2ofPQ >= 30); } // Calculate n Module calcN(); // Calculate Phi Module calcPhi(); // Calculate D Module calcD(); }while (n.toByteArray().Length != (keyByteSize) || d.toByteArray().Length != (keyByteSize )); }
private BigInteger[] getPrimesParallel(int keyBitSize) { System.Threading.Thread[] startThreads = new System.Threading.Thread[cores]; GenPrimeThread[] primeThreads = new GenPrimeThread[cores]; BigInteger[] primes = new BigInteger[cores]; BigInteger[] retPrime = new BigInteger[2]; for (int i = 0; i < cores; i++) { primeThreads[i] = new GenPrimeThread(core, keyBitSize); startThreads[i] = new System.Threading.Thread(new System.Threading.ThreadStart(primeThreads[i].run)); } // Start Threads for (int i_1 = 0; i_1 < cores; i_1++) { startThreads[i_1].Start(); } for (int i_2 = 0; i_2 < cores; i_2++) { startThreads[i_2].Join(); } for (int i_3 = 0; i_3 < cores; i_3++) { primes[i_3] = primeThreads[i_3].getPrime(); } for (int i_4 = 0; i_4 < cores; i_4++) { for (int j = cores - 1; j >= 0; j--) { log2ofPQ = java.lang.Math.abs(CryptobyHelper.logBigInteger(primes[i_4]) - CryptobyHelper .logBigInteger(primes[j])); if (log2ofPQ >= 0.1 || log2ofPQ <= 30) { retPrime[0] = primes[i_4]; retPrime[1] = primes[j]; return(retPrime); } } } retPrime[0] = BigInteger.ZERO; retPrime[1] = BigInteger.ZERO; return(retPrime); }