日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Openssl 之大数运算函数 BN

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Openssl 之大数运算函数 BN 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Openssl 之大數運算函數 BN

主要介紹Openssl中的有關大數運算函數,這個對于RSA研究和實現比較有價值
?
1.初始化函數

?
BIGNUM *BN_new(void);??? 新生成一個BIGNUM結構?

?
void BN_free(BIGNUM *a);?? 釋放一個BIGNUM結構,釋放完后a=NULL;?

?
void BN_init(BIGNUM *);??? 初始化所有項均為0,一般為BN_ init(&c)?

?
void BN_clear(BIGNUM *a);? 將a中所有項均賦值為0,但是內存并沒有釋放?

?
void BN_clear_free(BIGNUM *a); 相當與將BN_free和BN_clear綜合,要不就賦值0,要不就釋放空間。?

?
2.上下文情景函數,存儲計算中的中間過程
BN_CTX *BN_CTX_new(void);申請一個新的上下文結構?

?
void BN_CTX_init(BN_CTX *c);將所有的項賦值為0,一般BN_CTX_init(&c)?

?

? void BN_CTX_free(BN_CTX *c);釋放上下文結構,釋放完后c=NULL;

?

3.復制以及交換函數

? BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);將b復制給a,正確返回a,錯誤返回NULL

?

? BIGNUM *BN_dup(const BIGNUM *a);新建一個BIGNUM結構,將a復制給新建結構返回,錯誤返回NULL

?

? BIGNUM *BN_swap(BIGNUM *a, BIGNUM *b);交換a,b

?

4.取位函數


?int BN_num_bytes(const BIGNUM *a);返回a的位數,大量使用

?

?int BN_num_bits(const BIGNUM *a);

?

?int BN_num_bits_word(BN_ULONG w);他返回有意義比特的位數,例如0x00000432 為11。

?

5.基本計算函數

?

?int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);r=a+b

?

?int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);r=a-b

?

?int BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);r=a*b

?

?int BN_sqr(BIGNUM *r, BIGNUM *a, BN_CTX *ctx);r=a*a,效率高于bn_mul(r,a,a)

?

?int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d,

?

???????? BN_CTX *ctx);d=a/b,r=a%b

?

?int BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);r=a%b

?

?int BN_nnmod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);r=abs(a%b)

?

?int BN_mod_add(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,

?

???????? BN_CTX *ctx);r=abs((a+b)%m))

?

?int BN_mod_sub(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,

?

???????? BN_CTX *ctx); r=abs((a-b)%m))

?

?int BN_mod_mul(BIGNUM *ret, BIGNUM *a, BIGNUM *b, const BIGNUM *m,

?

???????? BN_CTX *ctx); r=abs((a*b)%m))

?

?int BN_mod_sqr(BIGNUM *ret, BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); r=abs((a*a)%m))

?

?int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx);r=pow(a,p)

?

?int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,

?

???????? const BIGNUM *m, BN_CTX *ctx); r=pow(a,p)%M

?

?int BN_gcd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);r=a,b最大公約數

?

?int BN_add_word(BIGNUM *a, BN_ULONG w);

?

?int BN_sub_word(BIGNUM *a, BN_ULONG w);

?

?int BN_mul_word(BIGNUM *a, BN_ULONG w);

?

?BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);

?

?BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);

?

?BIGNUM *BN_mod_inverse(BIGNUM *r, BIGNUM *a, const BIGNUM *n,

?

?????????? BN_CTX *ctx);模逆,((a*r)%n==1).

?

?

?

6.比較函數

?int BN_cmp(BIGNUM *a, BIGNUM *b);?? -1 if a < b, 0 if a == b and 1 if a > b.

?

?int BN_ucmp(BIGNUM *a, BIGNUM *b);? 比較a,b覺得值,返回值和上同。

?

?int BN_is_zero(BIGNUM *a);

?

?int BN_is_one(BIGNUM *a);

?

?int BN_is_word(BIGNUM *a, BN_ULONG w);

?

?int BN_is_odd(BIGNUM *a);??????? 上面四個返回1,假如條件成立,否則將返回0

?

7.設置函數

?int BN_zero(BIGNUM *a);? 設置a為0

?

?int BN_one(BIGNUM *a);?? 設置a為1

?

?const BIGNUM *BN_value_one(void); 返回一個為1的大數

?

?int BN_set_word(BIGNUM *a, unsigned long w); 設置a為w

?

?unsigned long BN_get_word(BIGNUM *a); 假如a能表示為long型,那么返回一個long型數

?

8.隨機數函數

?int BN_rand(BIGNUM *rnd, int bits, int top, int bottom);產生一個加密用的強bits的偽隨機數,若top=-1,最高位為0,top=0,最高位為1,top=1,最高位和次高位為1,bottom為真,隨機數為偶數?

?

?int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom);產生一個偽隨機數,應用于某些目的。

?

int BN_rand_range(BIGNUM *rnd, BIGNUM *range);產生的0<rnd<range

?

?int BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range);同上面道理

?

9.產生素數函數

BIGNUM *BN_generate_prime(BIGNUM *ret, int bits,int safe, BIGNUM *add,

?

???????? BIGNUM *rem, void (*callback)(int, int, void *), void *cb_arg);產生一個bits位的素數,后面幾個參數都可以為NULL

?

?int BN_is_prime(const BIGNUM *p, int nchecks,

?

???????? void (*callback)(int, int, void *), BN_CTX *ctx, void *cb_arg);

?

判斷是否為素數,返回0表示成功,1表示錯誤概率小于0。25,-1表示錯誤

?

10.位數函數

?int BN_set_bit(BIGNUM *a, int n);將a中的第n位設置為1,假如a小于n位將擴展

?

?int BN_clear_bit(BIGNUM *a, int n);將a中的第n為設置為0,假如a小于n位將出錯

?

?int BN_is_bit_set(const BIGNUM *a, int n);測試是否已經設置,1表示已設置

?

?int BN_mask_bits(BIGNUM *a, int n);將a截斷至n位,假如a小于n位將出錯

?

?int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);a左移n位,結果存于r

?

?int BN_lshift1(BIGNUM *r, BIGNUM *a); a左移1位,結果存于r

?

?int BN_rshift(BIGNUM *r, BIGNUM *a, int n); a右移n位,結果存于r

?

?int BN_rshift1(BIGNUM *r, BIGNUM *a); a左移1位,結果存于r

?

11.與字符串的轉換函數

int BN_bn2bin(const BIGNUM *a, unsigned char *to);將abs(a)轉化為字符串存入to,to的空間必須大于BN_num_bytes(a)

?

?BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);將s中的len位的正整數轉化為大數

?

?char *BN_bn2hex(const BIGNUM *a);轉化為16進制字符串

?

?char *BN_bn2dec(const BIGNUM *a);轉化為10進制字符串

?

?int BN_hex2bn(BIGNUM **a, const char *str);同上理

?

?int BN_dec2bn(BIGNUM **a, const char *str);同上理

?

?int BN_print(BIO *fp, const BIGNUM *a);將大數16進制形式寫入內存中

?

?int BN_print_fp(FILE *fp, const BIGNUM *a); 將大數16進制形式寫入文件

?

?int BN_bn2mpi(const BIGNUM *a, unsigned char *to);

?

?BIGNUM *BN_mpi2bn(unsigned char *s, int len, BIGNUM *ret);

?

12.其他函數

下面函數可以進行更有效率的模乘和模除,假如在重復在同一模下重復進行模乘和模除計算,計算r=(a*b)%m 利用了recp=1/m

?

BN_RECP_CTX *BN_RECP_CTX_new(void);

?

?void BN_RECP_CTX_init(BN_RECP_CTX *recp);

?

?void BN_RECP_CTX_free(BN_RECP_CTX *recp);

?

?int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *m, BN_CTX *ctx);

?

?int BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *a, BIGNUM *b,

?

?BN_RECP_CTX *recp, BN_CTX *ctx);

?

下面函數采用蒙哥馬利算法進行模冪計算,可以提高效率,他也主要應用于在同一模下進行多次冪運算

?

BN_MONT_CTX *BN_MONT_CTX_new(void);

?

?void BN_MONT_CTX_init(BN_MONT_CTX *ctx);

?

?void BN_MONT_CTX_free(BN_MONT_CTX *mont);

?

?int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *m, BN_CTX *ctx);

?

?BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from);

?

?int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,

?

???????? BN_MONT_CTX *mont, BN_CTX *ctx);

?

?int BN_from_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,

?

???????? BN_CTX *ctx);

?

?int BN_to_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,

?

???????? BN_CTX *ctx);

轉載于:https://www.cnblogs.com/yestreen/p/3205804.html

總結

以上是生活随笔為你收集整理的Openssl 之大数运算函数 BN的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: h片在线观看视频 | 无码少妇一级AV片在线观看 | 久久久久久久久久久久 | 欧美丝袜一区二区 | 无码人妻精品一区二区三区99v | 四虎av影院| 日韩大片一区二区 | 91禁外国网站| 国产精品久久久久久久久久东京 | 一区二区三区国产精品视频 | 亚洲狠狠婷婷综合久久久久图片 | bbbbbbbbb毛片大片按摩 | 影音资源av | 亚洲奶汁xxxx哺乳期 | av午夜在线| 久久密桃 | 国产成人三级一区二区在线观看一 | 99国产精品视频免费观看一公开 | 国产九九精品 | 777久久久 | 国产xxxx在线观看 | 日本精品一区 | 爱欲av| 国产精品专区在线观看 | 欧美精品久 | 艳母免费在线观看 | 午夜va | 五月综合激情日本mⅴ | 狠狠躁日日躁 | 一区二区三区av在线 | 欧美日韩精品综合 | 久久精品男人的天堂 | 日本一区电影 | 国产精品一区三区 | 国产视频资源 | 污视频免费在线观看网站 | 国产 欧美 在线 | 欧美第一精品 | 一卡二卡三卡在线视频 | 91 免费看片 | 久久一二区| 一本一道av| 99这里都是精品 | 欧美一级片黄色 | 黄色网址在线免费 | www.香蕉视频在线观看 | 三级性视频 | 日本精品一区二区在线观看 | 日本污网站 | 国产农村熟妇videos | 又大又硬又爽免费视频 | 97自拍视频在线 | 91黄色免费看 | 欧美精品99久久久 | 日本一区二区高清视频 | 久久色在线视频 | 快射视频在线观看 | 国产呻吟av| 日b在线观看 | 一区二区在线免费看 | 张柏芝亚洲一区二区三区 | av在线播放观看 | 国产精品久久久久三级 | 欧美精品亚洲精品日韩精品 | 水蜜桃av无码 | 啪啪综合网 | 日本一区二区黄色 | 伊人热久久 | 日韩视频国产 | 国产精品精东影业 | 操女人逼逼视频 | 亚洲精品在线播放视频 | 手机在线中文字幕 | 在线观看av中文字幕 | 欧美用舌头去添高潮 | 黑丝袜av | 1级av| 日本久久爱 | 中文字幕免费看 | 成人小视频在线免费观看 | 亚洲一区二区三区四区五区xx | 国产美女永久免费 | 亚洲爱情岛论坛永久 | 天堂网久久 | 欧美精品久久久久久 | 久久久久久久网 | 超污视频在线观看 | 激情五月在线 | 嫩草嫩草嫩草嫩草嫩草 | 国产精品一区二区人妻喷水 | 久久2019| 黄色av网站在线 | 波多野结衣在线观看视频 | 欧美精品videos另类 | 国产刺激高潮av | 国产免费一区二区三区在线播放 | 97人人澡人人爽人人模亚洲 | 亚洲日本欧美精品 | 偷偷在线观看免费高清av |