User:DevastatorIIC/RSA Factorization Program
From Wikipedia, the free encyclopedia
Programmed by Paul, Nov. 2005
Features:
- Timer
- random RSA# generator
- user inputs # of RSA#s to be generated and factored
- Primegen 2 (30% faster)
#include <iostream>
#include <ctime>
using namespace std;
int factor( unsigned int );
int getPrime( int );
unsigned int makeRSA( void );
int main() {
srand( time( 0 ) ); cout << "Enter number of iterations: "; int a; cin >> a; int *RSAs = new int[ a ]; for ( int i = 0; i < a; i++ ) { RSAs[i] = makeRSA(); } int s = time(0); //start timer for ( int j = 0; j < a; j++ ) factor(RSAs[j]); int e = time(0); //end timer cout << "It took " << e-s << " seconds to factor " << a << " products over 1 billion of two primes!\n"; system("pause"); return 0;
}
int factor( unsigned int RSA ){
int divisor = (int)sqrt( (double)RSA ); //first value is sqrt(RSA) while ( 1 ){ //loop until something is returned divisor = getPrime( divisor - 1 ); //find the first prime lower than sqrt(RSA) if ( RSA % divisor == 0 ) //if evenly divisible by said prime return divisor; //return original prime }
}
int getPrime( int a ){
int sqr, notprime, k, m; while ( a != 0 ){ //while a isn't zero if ( a % 2 != 0 && a % 3 != 0 || a == 2 || a == 3 ) { sqr = (int)sqrt( (double)a ); notprime = 0; k = 1; m = 6*k; while ( (m-1) <= sqr ) { if ( (a % (m-1) == 0) || (a % (m+1) == 0) ) { notprime = 1; break; } k++; m = 6*k; } if ( notprime == 0 ) { return a; } } a--; //decrement a } cerr << "Error: No prime found.\n"; exit(1);
}
unsigned int makeRSA() {
int a = 31623 + rand() % 33914; //Get random number between sqrt 1 billion and 2^16 a = getPrime(a); //find prime close to it int b = 31623 + rand() % 33914; b = getPrime(b); return a*b; //return product
}