2012-03-20 8 views
2

documentation for GMPは、乱数生成のためにのみ、以下のアルゴリズムを一覧表示するようだ:GMPを暗号化に使用する:乱数を取得する方法?

  • gmp_randinit_mt、メルセンヌツイスターを。
  • gmp_randinit_lc_2expおよびgmp_randinit_lc_2exp_size、線形合同性。

gmp_randinit_defaultもありますが、gmp_randinit_mtを指しています。

Mersenne Twisterも線形合同ジェネレータも暗号化に使用しないでください。 GMPを使用して暗号コードを構築する場合、人々は通常何をしますか?

(暗号化/復号化のための暗号APIを使用すると、暗号化ライブラリにはない新しいアルゴリズムが実際に実装されるため、役立たない)

+1

新しい暗号を実装し、悪いカルマをもたらすもの発電機を使用するために知りません。非常に悪いカルマ!! http://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology –

+1

http://www.lysator.liu.se/~nisse/nettle/nettleを参照してください。 html#GMPのメンテナーの一人が書いた暗号ライブラリのランダム性。 –

答えて

0

免責事項:私はRNGで「ちっぽけ」しかなく、1年以上前です。

あなたがLinuxボックスを使用している場合、解決策は比較的単純で非決定論的です。 /dev/urandomから希望のビット数だけ開いて読んでください。しかし、あなたのプログラムにたくさんのランダムビットが必要な場合は、/dev/urandomのビット数をPRNGのシードとして使用したいかもしれません。

boostは、多数のPRNGと、非確定的なRNG、random_deviceを提供します。 random_deviceは、Windows上では全く同じ/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; 
} 
+0

うん、そうだよ。 '/ dev/urandom'(または'/dev/random')からビットを取得し、 'mpz_import'を使ってビットをGMP番号に変換できます。私はこれが本当にこれに対処する通常の方法であるかどうか疑問に思っていました。(これは扱いにくいと感じています - 私は任意精度の数学ライブラリを持っていますので、暗号で安全な乱数を教えてください) – Jay

+1

任意の(複数の)高精度ライブラリであり、必ずしもRNGライブラリではありません。開発者はできるだけ早く非常に大きな数を使用するように作業し、楽しいためにいくつかのRNGを含めました。 私は/ dev/urandomを使用して私の提案を取り戻し、boost :: random :: random_deviceを使うことを提案します。これは標準ライブラリにありますが、あなたのコンパイラはそれをまだサポートしていないかもしれません。 Merseene Twister(非常に短いシーケンス)を使用していますが、それははるかに厄介なように見えるかもしれません。それ以外の場合はBlum Blum Shubなどのコードを記述する必要があります – dB8

+0

ありがとうございます - しかし、私は普通のCに固執する必要があります...とにかく - 新しいrandmの種を使ってRNGを再製作することには利点がありますか? number_を使用し、 'mpz_import'の代わりに' mpz_urandom'を使用していますか? – Jay

関連する問題