2010-10-28 53 views
2

我想知道在Openssl中是否有可能是一個大數模的小整數?大數模在Openssl中的一個小整數

說我產生兩個大的素數:

BN_generate_prime(p,512,0,0,0,0,0); 
BN_generate_prime(q,512,0,0,0,0,0); 

和計算產品N

BN_mul(N,p,q,ctx); 

我想測試是否N是 「百隆整數」(N模4 = = 3),但我不知道如何做到這一點,因爲功能BN_mod只支持大數字。

+0

爲什麼不只是測試是否(最不重要)位0和1被設置?例如'(p-> d [0]&0x3 == 0x3)',或'BN_is_bit_set(p,0)&& BN_is_bit_set(p,1)' - 我在這裏丟失了什麼? – 2015-05-06 15:25:25

回答

4

是的,這是可能的。

最好和有效的方法是在WWW的答案給出,這是給BN_mod_word()

效率不高的方法是先轉換一個小整數BIGNUM。這很麻煩,但並不困難。我將通過計算11 mod 3BN_mod,向您展示兩種創建BIGNUM的方法。首先,爲你的號碼申報一個BIGNUM。

BIGNUM *N = BN_new(); 
BIGNUM *M = BN_new(); 

方法1:將您的號碼爲字符串,然後將字符串到BIGNUM。

#include <sstream> 
int n = 11; 
std::ostringstream num_str; 
num_str << n; 
BN_dec2bn(&N, num_str.str().c_str()); 

(在C語言中,你可以做char buf[12]; sprintf(buf, "%d", n); BN_dec2bn(&N, buf);

方法2:給你的號碼作爲字節數組,但要注意的OpenSSL希望在大端格式的字節,而且將永遠解釋您字節作爲正數。

#include <arpa/inet.h> // For htonl to make the integer big endian 
int m = 3; 
m = htonl(m); 
BN_bin2bn((unsigned char *) &m, sizeof(m), M); 

然後就像平常一樣使用你的OpenSSL函數。

BN_mod(rem, N, M, ctx); 
BN_print_fp(stdout, rem); // (Using N=11 and M=3 above, this line prints 2) 

並釋放您的BIGNUM s。

BN_free(N); 
BN_free(M); 
1

我想知道是否有可能是一個很大的數字模OpenSSL中的一個小的整數?

...測試如果N是一個「Blum整數」(N mod 4 == 3),但是我不知道如何做到這一點,因爲函數BN_mod只支持大數字。

是的,但它需要是一個無符號整數,這似乎與mod 4等價類有關。使用。

我使用它在驗證Diffie-Hellman參數之前使用它們。例如,請參閱Crypto Stack Exchange上的Diffie-Hellman Parameter Check (when g = 2, must p mod 24 == 11?)

該功能的手冊頁位於BN_mod_word(3)