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  {
  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  {
  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 {
BN_free(&a[i]); //使用完必须释放

BN_free(&b[i]);
}

 BN_print_fp(stdout,ret);

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

你可能感兴趣的:(SM2椭圆曲线)