What I want to be able to do in a declaration is:
encryption::rsa<1024> my_1024bit_rsa;encryption::rsa<2048> my_2048bit_rsa;math::unsigned_integer<128> my_128bit_unsigned_integer;math::integer<4096> my_4096bit_signed_integer;//etc
mainly because I want to force people to think about what size they pick, and secondly because i've read it allows for extra optimization by the compiler.
What I have so far is
header rsa.hpp
template<unsigned int size = 1024>class rsa{public: // constructs a new pair of keys rsa(); math::integer encrypt(const math::integer& message) const; math::integer decrypt(const math::integer& message) const; // defines a single key struct key { math::integer exponent; math::integer modulus; };protected:private: rsa(const rsa&); rsa& operator= (const rsa&); bool valid_; key key_encryption; key key_decryption;};
source rsa.cpp
rsa::rsa() // <------ error 1 : valid_(false){ while(!valid_) { // we want p and q to be random primes and p != q math::integer p(math::integer::random(size)); math::integer q(math::integer::random(size)); while(!math::prime::isprime(p)){ p = math::integer::random(size); } while(!math::prime::isprime(q) || q == p){ q = math::integer::random(size); } // n is our modulus math::integer n(p*q); // it must be able to take the modulus of our largest chunk, I picked the size of a char if(n < 256) continue; // phi is our totient math::integer phi((p - 1) * (q - 1)); // e is our encryption exponent math::integer e = rand() % (65537); // e must be coprime with phi // e can not be even // e can not be a factor of phi // 5 <= e < 65537 while(math::greatestcommondivisor(phi, e) != 1 || e % 2 == 0 || phi % e == 0){ e = (rand() % (65537 - 5) + 5; } // d is decryption exponent try { math::integer d(math::modularlineequation(e, 1, phi)); } // the equation is not always solvable catch(...) { continue; } // we need a positive exponent if(d <= 5){ continue }else{ valid_ = true; } } // asign the keys key_encryption.modulus = n; key_encryption.exponent = e; key_decryption.modulus = n; key_decryption.exponent = d;}integer rsa::encrypt(const integer& message) const{ return math::integer::power(message, key_encryption.exponent) % key_encryption.modulus;}integer rsa::decrypt(const integer& message) const{ return math::integer::power(message, key_decryption.exponent) % key_decryption.modulus;}
compiling results in (at least one) error. I've marked the line it mentions in the source file
/core/encryption/rsa.cpp|8|error: ‘template<unsigned int size> class core::encryption::rsa’ used without template parameters|/core/encryption/rsa.cpp|8|error: ISO C++ forbids declaration of ‘rsa’ with no type|/core/encryption/rsa.cpp|8|error: ‘int core::encryption::rsa()’ redeclared as different kind of symbol|/core/encryption/rsa.hpp|10|error: previous declaration of ‘template<unsigned int size> class core::encryption::rsa’|
Does this mean I can only declare the constructor in the header?
Can I use the
unsigned int size
as an rvalue in my code? How would I define a template operator that can handle the following operation (regardless of the actual comparing data part)?
math::integer<1024> == math::integer<256>