openSSL 中BIGNUM的使用记录(二)——BIGNUM的使用

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-22 18:13   29   0


功能:求两个向量的内积

第一种方法

int uInnerProduct(int dime, BIGNUM *r,BIGNUM a[],BIGNUM b[])
{
BIGNUM *temp;

BN_CTX *ctx = NULL; //定义一个BN_CTX类型变量
ctx = BN_CTX_new();
BN_CTX_start(ctx);
// 如果有大数函数(如BN-mul())中有BN_CTX变量,也需要在加入这三句。使用完用后面的end和free释放。

temp=BN_CTX_get(ctx); //给Temp分配一个空间

BN_set_word(r,0); //给r所指向的变量赋值为0

//计算内积

for(int i=0;i<dime;i++)
{
BN_mul(temp,&a[i],&b[i],ctx);
BN_add(r,r,temp);
}
BN_CTX_end(ctx);
BN_CTX_free(ctx);
//配合上面的new和start
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
BIGNUM a[4];
BIGNUM b[4];
BIGNUM *ret;
ret=BN_new(); //和BN_free()配对

int dime=4;
for(int i=0;i<dime;i++)
{
BN_init(&a[i]); //如果不是指针定义方法,则必须在使用该变量前对其初始化,类似于BN-new()
BN_init(&b[i]);

BN_rand(&a[i],512,1,0);
BN_rand(&b[i],512,0,1); //但每次产生的都是一样的
BN_print_fp(stdout,&a[i]);
printf("\n");
BN_print_fp(stdout,&b[i]);
printf("\n");
}

uInnerProduct(dime,ret,a,b);

for(int i=0;i<dime;i++)
{
BN_free(&a[i]); //使用完必须释放

BN_free(&b[i]);
}

BN_print_fp(stdout,ret);

BN_free(ret);
system("pause");
return 0;
}

第二种方法:

int uInnerProduct(int dime, BIGNUM *r,BIGNUM **a,BIGNUM **b)
{
BIGNUM *temp;

BN_CTX *ctx = NULL;
ctx = BN_CTX_new();
BN_CTX_start(ctx);

temp=BN_CTX_get(ctx);

BN_set_word(r,0);
for(int i=0;i<dime;i++)
{
BN_mul(temp,a[i],b[i],ctx);
BN_add(r,r,temp);
}
BN_CTX_end(ctx);
BN_CTX_free(ctx);
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
BIGNUM *a[4];
BIGNUM *b[4];

BIGNUM *ret;

int dime=4;
ret=BN_new();


ctx = BN_CTX_new();
BN_CTX_start(ctx);

for(int i=0;i<dime;i++)
{
a[i]=BN_CTX_get(ctx); //要初始化,但后面不用free释放了
b[i]=BN_CTX_get(ctx);

BN_rand(a[i],3,1,0);
BN_rand(b[i],3,0,1);
BN_print_fp(stdout,a[i]);
printf("\n");
BN_print_fp(stdout,b[i]);
printf("\n");
}

uInnerProduct(dime,ret,a,b);
BN_print_fp(stdout,ret);

BN_free(ret);
system("pause");
return 0;
}

第三种方法:可以把ctx变量定义为全局变量,这样,子函数中的ctx = BN_CTX_new();BN_CTX_start(ctx);和 BN_CTX_end(ctx);BN_CTX_free(ctx)可以不要。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP