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



功能:求两个向量的内积

第一种方法

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)可以不要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值