2012-09-04 76 views
1

我有一些問題使用OpenSSL的BIGNUM庫提供「正確答案」。我正在使用OpenSSL 1.0.1c(2012年5月,標準Mint倉庫中提供的最新軟件包)。OpenSSL BIGNUM BN_mod_exp問題

我使用BIGNUMs作爲使用有限域(又名伽羅瓦域)的密碼學項目。基本上我有一個大素數(q)和一個安全素數(p,其中p = 2q + 1)。我的領域是q階的Fp。

我需要生成一個「g」。我發現最簡單的方法是選擇一個隨機的「h」(1 < h < p-1),然後做g = h ^((p-1)/ q)mod p。隨着「克」我擺脫了這一點,我應該能夠通過做g^q mod p = 1來證明它是在FF中。

當我對紙上的任何合理的小數字執行此操作時,真正。但是,當我使用OpenSSL和大的素數時,它不起作用!當我測試g^q mod p == 1的結果時,它經常使用BN_is_one()失敗。如果我將這個值打印出來,它總是一個很大的不相關的素數。

這是怎麼回事?我不確定這裏發生了什麼,或者如果我誤解了某些東西。

片段下面我的代碼:

BN_generate_prime(q, KEYSIZE - 1, 0, 0, 0, 0, 0); //generate "q" 

// Calculate "p" = 2q + 1 
BN_lshift1(p, q); 
BN_add(p, p, one); //one = BN_one() 

// 1: gExp = (p-1)/q 
// 2: h => 1 < h < (p-1) 
// 3: g = h^gExp mod p 
BN_div(gExp, NULL, pMinusOne, q, ctx);  // (1) 
BN_pseudo_rand_range(h, pMinusOne);   // (2) 
BN_mod_exp(g, h, gExp, p, ctx);    // (3) 

BN_mod_exp(temp, g, q, p, ctx); // g^q mod p = 1, or it should 

回答

1

當你在你的代碼片段計算它,p不一定素,它只是一個數字,它是形式2*q+1q素。對於q的很多小數值,這個p碰巧是主要的,但這大多是巧合,如果您使用BN_is_prime進行檢查,您可能會發現您生成的p未通過測試。

相反,通過設置BN_generate_primesafe參數,然後通過右移計算q,與safe的主要將是你所需要的形式,並且斬去最低位給你的黃金q直接生成p

+0

哦,男人,你是完全正確的。我甚至沒有想到這個!看起來我需要做一些關於「安全」素數的閱讀(以及BN_generate_prime的'safe'參數的獎勵。謝謝! –