我想知道在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
只支持大數字。
我想知道在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
只支持大數字。
是的,這是可能的。
最好和有效的方法是在WWW的答案給出,這是給BN_mod_word()。
效率不高的方法是先轉換一個小整數BIGNUM
。這很麻煩,但並不困難。我將通過計算11 mod 3
和BN_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);
我想知道是否有可能是一個很大的數字模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)
。
爲什麼不只是測試是否(最不重要)位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