documentation for GMP似乎只列出了以下随机数生成算法:
gmp_randinit_mt
,Mersenne Twister; gmp_randinit_lc_2exp
和gmp_randinit_lc_2exp_size
,线性同余。还有gmp_randinit_default
,但它指向gmp_randinit_mt
。
Mersenne Twister和线性同余生成器都不应该用于密码学。 那么,当人们想要使用GMP构建一些加密代码时,他们通常会做什么?
(使用加密API加密/解密/等等没有用,因为我实际上实现了一个新的算法,加密库没有这个算法。)
答案 0 :(得分:0)
免责声明:我只对RNG进行了“修补”,这是一年多以前的事了。
如果你在Linux机器上,解决方案相对简单且不确定。只需打开并从/dev/urandom
读取所需的位数。但是,如果您的程序需要大量随机位,那么您可能希望使用/dev/urandom
中较小数量的位作为PRNG的种子。
boost提供了许多PRNG和非确定性RNG,random_device。 random_device在linux上使用相同的/dev/urandom
,在Windows上使用类似的(IIRC)函数,所以如果你需要windows或x-platform。
当然,您可能希望/需要使用GMP的类型和功能根据您喜欢的RNG编写函数。
编辑:
#include<stdio.h>
#include<gmp.h>
#include<boost/random/random_device.hpp>
int main( int argc, char *argv[]){
unsigned min_digits = 30;
unsigned max_digits = 50;
unsigned quantity = 1000; // How many numbers do you want?
unsigned sequence = 10; // How many numbers before reseeding?
mpz_t rmin;
mpz_init(rmin);
mpz_ui_pow_ui(rmin, 10, min_digits-1);
mpz_t rmax;
mpz_init(rmax);
mpz_ui_pow_ui(rmax, 10, max_digits);
gmp_randstate_t rstate;
gmp_randinit_mt(rstate);
mpz_t rnum;
mpz_init(rnum);
boost::random::random_device rdev;
for( unsigned i = 0; i < quantity; i++){
if(!(i % sequence))
gmp_randseed_ui(rstate, rdev.operator ()());
do{
mpz_urandomm(rnum, rstate, rmax);
}while(mpz_cmp(rnum, rmin) < 0);
gmp_printf("%Zd\n", rnum);
}
return 0;
}