rsa_san.cpp in RSA_file_encryption.
Sponsored links
#include "stdafx.h"
// This is a slow but easy RSA encryption class
// By sanicle,2005.12
// 3mn@3mn.net
#include "stdio.h"
#include "rsa_san.h"
class Prime_factory_san
{
unsigned np;
unsigned *pl;
public:
Prime_factory_san();
~Prime_factory_san();
vlong find_prime( vlong & start );
};
// prime factory implementation
static int is_probable_prime_san( const vlong &p )
{
// Test based on Fermats theorem a**(p-1) = 1 mod p for prime p
// For 1000 bit numbers this can take quite a while
const rep = 4;
const unsigned any[rep] = { 2,3,5,7 };
for ( unsigned i=0; i<rep; i+=1 )
if ( modexp( any[i], p-vlong(1), p ) != vlong(1) )
return 0;
return 1;
}
Prime_factory_san::Prime_factory_san()
{
np = 0;
unsigned NP = 200;
pl = new unsigned[NP];
// Initialise pl
unsigned SS = 8*NP; // Rough estimate to fill pl
char * b = new char[SS+1]; // one extra to stop search
for (unsigned i=0;i<=SS;i+=1) b[i] = 1;
unsigned p = 2;
while (1)
{
// skip composites
while ( b[p] == 0 ) p += 1;
if ( p == SS ) break;
pl[np] = p;
np += 1;
if ( np == NP ) break;
// cross off multiples
unsigned c = p*2;
while ( c < SS )
{
b[c] = 0;
c += p;
}
p += 1;
}
delete [] b;
}
Prime_factory_san::~Prime_factory_san()
{
delete [] pl;
}
vlong Prime_factory_san::find_prime( vlong & start )
{
unsigned SS = 1000; // should be enough unless we are unlucky
char * b = new char[SS]; // bitset of candidate primes
unsigned tested = 0;
while (1)
{
unsigned i;
for (i=0;i<SS;i++)
b[i] = 1;
for (i=0;i<np;i++)
{
unsigned p = pl[i];
unsigned r = start % vlong(p); // not as fast as it should be - could do with special routine
if (r) r = p - r;
// cross off multiples of p
while ( r < SS )
{
b[r] = 0;
r += p;
}
}
// now test candidates
for (i=0;i<SS;i++)
{
...
...
... to be continued.
This is a preview. To get the complete source file,
please click here to download the whole source code package.