ProofSystem/include/ProofSystem/PrimeNumbers.hpp¶
Handles prime number generation/checking. More...
Classes¶
| Name | |
|---|---|
| class | PrimeNumbers |
| class | PrimeNumbers::BabyStepGiantStep |
Defines¶
| Name | |
|---|---|
| USE_CRYPTO3 |
Detailed Description¶
Handles prime number generation/checking.
Date: 2024-01-26 Henrique A. Klein ([email protected])
Macros Documentation¶
define USE_CRYPTO3¶
Source code¶
#ifndef _PRIME_NUMBERS_HPP_
#define _PRIME_NUMBERS_HPP_
#define _USE_CRYPTO3_
#include <ctime>
#include <unordered_map>
#ifdef _USE_CRYPTO3_
#include <nil/crypto3/multiprecision/cpp_int.hpp>
#include <nil/crypto3/multiprecision/miller_rabin.hpp>
#else
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/miller_rabin.hpp>
#include <boost/random.hpp>
#endif
class PrimeNumbers
{
public:
#ifdef _USE_CRYPTO3_
using cpp_int = nil::crypto3::multiprecision::cpp_int;
#else
using cpp_int = boost::multiprecision::cpp_int;
#endif
template <std::size_t bit_size>
static bool GenerateSafePrime( std::size_t max_attempts, cpp_int &out_val )
{
std::size_t loop_limit = max_attempts * 50000;
auto seed = clock();
boost::mt11213b base_gen( seed );
boost::random::independent_bits_engine<boost::mt11213b, bit_size, cpp_int> engine( base_gen );
boost::mt19937 ref_engine( seed );
for ( std::size_t i = 0; i < loop_limit; ++i )
{
cpp_int candidate = engine();
if ( miller_rabin_test( candidate, max_attempts, ref_engine ) && //
miller_rabin_test( ( candidate - 1 ) / 2, max_attempts, ref_engine ) )
{
out_val = std::move( candidate );
return true;
}
}
return false;
}
// In the range [2, prime_number)
static cpp_int GetRandomNumber( const cpp_int &prime_number );
// Finds a generator for the multiplicative group modulo prime_number
static bool GetGeneratorFromPrime( std::size_t max_attempts, cpp_int prime_number, cpp_int &out_val );
static cpp_int ModInverseEuclideanDivision( cpp_int x, cpp_int prime );
static cpp_int SqrtMod( const cpp_int &number, const cpp_int &prime );
static cpp_int PowHighPrec( const cpp_int &value, const int64_t &exp );
class BabyStepGiantStep
{
public:
BabyStepGiantStep( const cpp_int &prime, const cpp_int &generator );
cpp_int SolveECDLP( const cpp_int &number );
private:
cpp_int g_n_inv;
cpp_int step_size;
cpp_int prime_number;
std::unordered_map<cpp_int, cpp_int> value_table;
};
};
#endif
Updated on 2026-03-04 at 13:10:44 -0800