11.openssl编程——大数
11.1 介绍
大数一般指的是位数很多的数。计算机表示的数的大小是有限的,精度也是有限的,精度也是有限的,它不能支持大数运算。密码学中采用了很多大数计算,为了让计算机实现大数运算,用户需要定义自己的大数表示方式及实现各种大数运算。Openssl为我们提供了这些功能,主要用于非对称算法。
11.2 openssl大数表示
struct bignum_st
{
BN_ULONG *d;
int top; 用来指明大数占多少个BN_ULONG空间
int dmax;d数组的大小
int neg;是否为负数,如果为1,则是负数,为0,则为正数
int flags; 用于存放一些标记,比如flags含有BN_FLG_STATIC_DATA时,表明d的内存是静态分配的;含有BN_FLG_MALLOCED时,d的内存是动态分配的。
}
11.3 大数函数
大数函数一般都能根据函数名字知道起实现的功能
a.BN_rand/BN_pseudo_rand
功能:生成一个随机的大数
b.BN_rand_range/BN_pseudo_rand_range
功能:生成随机数,但是给出了随机数的范围。
c.BN_dup
功能:大数复制。
d.BN_generate_prime
功能:生成素数
e.int BN_add_word(BIGNUM *a, BN_ULONG w)
功能:给大数a加上w.
f.BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
功能:将内存中的数据转换为大数,为内存地址,len为数据长度,ret返回值
g.int BN_bn2bin(const BIGNUM *a, unsigned char *to)
功能:将大数转换为内存形式。输入参数为大数a,to为输出缓冲区地址,缓冲区需要预先分配,返回值为缓冲区的长度。
h.char *BN_bn2dec(const BIGNUM *a)
功能:将大数转换成正数字符串。返回值中存放正数字符串,它由内部分配空间,用户必须在外部用OPENSSL_free函数释放该空间。
i.BN_cmp
功能:比较两个大数
j.BIGNUM *BN_mod_inverse(BIGNUM *in, const BIGNUM *a, const BIGNUM *n, BN_CTX *cttx)
功能: