SM2算法第二十八篇:Openssl有关大数运算函数介绍(全面)

来源:互联网 发布:上海期货软件下载 编辑:程序博客网 时间:2024/04/28 03:49

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);
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 三岁宝宝说话少怎么办 快4岁不会说话怎么办 宝宝2岁半不爱说话怎么办 两岁半宝宝注意力不集中怎么办 中国出生的外籍小孩怎么办签证 中国人入外籍后国内财产怎么办 中国人入外籍后国内资产怎么办 小孩去美国上小学怎么办 咳嗽震的胸口疼怎么办 高中孩子对手机着迷怎么办 小孩不肯读书沉迷游戏怎么办 小孩沉迷吃鸡游戏怎么办 高一数学成绩差怎么办 小孩子学数学用手指算怎么办 孩子d和b分不清怎么办 和家人走散后怎么办幼儿教案 小孩胃口不好不爱吃饭怎么办 幼儿园孩子学习记不住怎么办 幼儿园小孩数字记不住怎么办 大班教案走丢了怎么办 ppt加视频反了怎么办 拔罐之后背疼怎么办 拔完火罐后背疼怎么办 打印机红色的口堵了怎么办 打印机红色复印不出来怎么办 打印机加错颜色墨水怎么办 中班安全教案脚扭伤了怎么办 中班脚扭伤了怎么办教案 中班安全脚扭伤了怎么办 中班安全脚扭伤了怎么办反思 走丢了怎么办教案反思 汽车后轱辘不转怎么办 走丢了怎么办社会教案 小老鼠搬鸡蛋鸡蛋太大怎么办 小班走丢了怎么办教案 小班走丢了怎么办反思 房屋外墙漏水物业不管怎么办 厨房墙砖用色花怎么办 小孩子做错事很偏激怎么办 孩子在学校偷钱怎么办 房间墙壁上到处有湿虫怎么办