2012-10-23 30 views
1

我在OpenSSL BIGNUM中遇到了一些問題。我試圖實現一個基本的ElGamal協議。我遇到的問題是這些計算中的一部分沒有返回我期待的值!當我嘗試計算乘法逆時,這是最明顯的。使用OpenSSL BIGNUMs的數學:如何計算乘法逆?

例如:

static void roughExample() { 
BIGNUM *u1 = BN_new(); 
BIGNUM *u2 = BN_new(); 

BIGNUM *one = BN_new(); 
BN_one(one); 
BIGNUM *negOne = BN_new(); 
BN_zero(negOne); 
BN_sub(negOne, negOne, one); // So negOne should = -1 and it does 

BN_print_fp(stdout, negOne); //shows -1 here 

BN_rand_range(u1, q); // q = large prime, point being that u1 = random large num 
BN_print_fp(stdout, u1); 

BN_exp(u2, u1, negOne, ctx); 
BN_print_fp(stdout, u2); // in the output, u1 = u2. 
} 

上面的輸出出來爲:-1,[大素],[完全相同的大素數。

很明顯,BN_exp沒有做我期待的。在這種情況下,我想我可以使用BN_div來做1/x,但我想知道是否有更大的圖片,我錯過了。我正在使用這種計算方式進行大量計算,並且我不會總是能夠直觀地驗證值是否像我預期的那樣發生了變化。

任何人都可以幫忙嗎?提前致謝!

編輯:我嘗試使用1/X,和它產生的值爲0 ...:/

+0

BN_exp()適用於正指數。 –

回答

1

你需要一個BN_mod_inverse功能。其他函數不提供這樣的算法。

如果q是素數,也可以執行q-2模q的冪運算。由於費馬的小定理,你將獲得反場成員。

+0

我沒有注意到這個功能,謝謝Pavel! –