使用GMP进行密码学:如何获取随机数?

时间:2012-03-20 17:19:53

标签: random cryptography gmp

documentation for GMP似乎只列出了以下随机数生成算法:

  • gmp_randinit_mt,Mersenne Twister;
  • gmp_randinit_lc_2expgmp_randinit_lc_2exp_size,线性同余。

还有gmp_randinit_default,但它指向gmp_randinit_mt

Mersenne Twister和线性同余生成器都不应该用于密码学。 那么,当人们想要使用GMP构建一些加密代码时,他们通常会做什么?

(使用加密API加密/解密/等等没有用,因为我实际上实现了一个新的算法,加密库没有这个算法。)

1 个答案:

答案 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;
}