OpenSSL测试-大数
Posted 20201212油菜园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL测试-大数相关的知识,希望对你有一定的参考价值。
任务详情
- 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
- 基于OpenSSL的大数库计算2的N次方,N为你学号的后四位(5‘)
- 基于OpenSSL的大数库计算你以及前面5位同学和后面5位同学的8位学号的乘积,N为你学号的后四位(5‘)
- 用Python或bc命令验证计算的正确性(5’)
- 提交代码(或代码链接)和运行结果截图
任务过程
1. 计算2的1212次方
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>
//20201212
int main()
BN_CTX *r[3];
BIGNUM *a;
BIGNUM *b;
BIGNUM *c;
char s[512+1] = "2";
char t[512+1] = "4bc"; //1212
char *x;
r[0] = BN_CTX_new();
a = BN_new();
b = BN_new();
c = BN_new();
BN_hex2bn(&a, s);
BN_hex2bn(&b, t);
BN_exp(c, a, b, r[0]);//r=pow(a,b)
x = BN_bn2dec(c);
puts(x);
BN_free(a);
BN_free(b);
BN_free(c);
BN_CTX_free(r[0]);
free(x);
return 0;
2. 计算你以及前面5位同学和后面5位同学的8位学号的乘积
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>
//20201212
int main()
BN_CTX *r[11];
BIGNUM *bn[12];
int i;
const char s[11][9] = "20201207", "20201208", "20201209", "20201210", "20201211", "20201212", "20201213", "20201214", "20201215", "20201216", "20201217";
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]);
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;
以上是关于OpenSSL测试-大数的主要内容,如果未能解决你的问题,请参考以下文章