您的位置:首页 > 运维架构

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

2016-05-21 16:15 435 查看
出处: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openssl BIGNUM