OpenSSL测试-大数

  1. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
  2. 基于OpenSSL的大数库计算2的N次方,N为你学号的后四位(5‘)
  3. 基于OpenSSL的大数库计算你以及前面5位同学和后面5位同学的8位学号的乘积,N为你学号的后四位(5‘)
  4. 用Python或bc命令验证计算的正确性(5’)
  5. 提交代码(或代码链接)和运行结果截图

    在openeuler环境下

    基于OpenSSL的大数库计算2的N次方,N为你学号的后四位

    代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>

int main()
{
BN_CTX *r;
BIGNUM *a;
BIGNUM *b;
BIGNUM *c;

char *x;
char s[]="2";
char t[]="1322";

r = BN_CTX_new();
a = BN_new();
b = BN_new();
c = BN_new();

BN_dec2bn(&a, s);
BN_dec2bn(&b, t);
BN_exp(c,a,b,r);//计算2^n次方

x = BN_bn2dec(c);//把计算结果(大数)转化成10进制数

puts(x);//打印出x

BN_free(a);
BN_free(b);
BN_free(c);

BN_CTX_free(r);

free(x);

return 0;
}

验证:

基于OpenSSL的大数库计算你以及前面5位同学和后面5位同学的8位学号的乘积,N为你学号的后四位

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>

int main()
{
BN_CTX *r[11];
BIGNUM *bn[12];
int i;
const char s[11][9]={"20201317","20201318","20201319","20201320","20201321","20201322","20201323","20201324","20201325","20201326","20201327"};
char* out;
char t[2]="1";



for(i=0;i<11;i++){
bn[i]=BN_new();
BN_dec2bn(&bn[i],s[i]);
r[i] = BN_CTX_new();
}
bn[11]=BN_new();
BN_dec2bn(&bn[11],t);

for(i=0;i<11;i++){
BN_mul(bn[11],bn[11],bn[i],r[i]); //计算11个同学学号的乘积
}

out= BN_bn2dec(bn[11]); //将大数转化转化成十进制的字符串

puts(out);//打印出字符串


for(i=0;i<11;i++){
BN_free(bn[i]);
BN_CTX_free(r[i]);

}
BN_free(bn[i]);

free(out);

return 0;
}

截图:

验证:

 

posted @ 2023-04-11 20:29  20201322陈俊池  阅读(54)  评论(0编辑  收藏  举报