SM2算法第二十六篇:openSSL 中BIGNUM的使用记录


出处:http://blog.163.com/xiaoting_hu/blog/static/5046477220136215847597/

转载原因:对于我理解(1)BN_CTX_get()  (2)BN_set_word()  有很大帮助


功能:求两个向量的内积

第一种方法

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值