OpenSSL测试-大数
任务详情
0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
- 基于OpenSSL的大数库计算1000内的素数的乘积(5‘)
- 基于OpenSSL的大数库计算你以及后面15位同学的8位学号(数字)的乘积(5‘)
- 用Python或bc命令验证计算的正确性(5’)
- 提交代码(或代码链接)和运行结果截图
任务过程 - 基于OpenSSL的大数库计算1000内的素数的乘积
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>
int is_prime(int num)
{
if (num < 2)
return 0;
else if (num == 2)
return 1;
else if (num % 2 == 0)
return 0;
else
{
int i;
for (i = 3; i <= num / 2; i += 2)
{
if (num % i == 0)
return 0;
}
return 1;
}
}
int main()
{
BIGNUM *result = BN_new();
BIGNUM *num = BN_new();
BN_CTX *r = BN_CTX_new();
int i;
BN_set_word(result, 1);
for (i = 2; i < 1000; i++)
{
if (is_prime(i))
{
BN_set_word(num, i);
BN_mul(result, result, num, r);
}
}
char *result_str = BN_bn2dec(result);
printf("%s\n", result_str);
BN_free(result);
BN_free(num);
BN_CTX_free(r);
OPENSSL_free(result_str);
return 0;
}
结果:
验证:
- 基于OpenSSL的大数库计算你以及后面15位同学的8位学号(数字)的乘积
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/bn.h>
//20201205
int main()
{
BN_CTX *r[11];
BIGNUM *bn[12];
int i;
const char s[16][9] = {"20201205", "20201206", "20201207", "20201208", "20201209", "20201210", "20201211", "20201212", "20201213", "20201214", "20201215","202012016","20201217","20201218","20201219","20201220"};
char *out;
char t[2] = "1";
for (i = 0; i < 16; i++)
{
bn[i] = BN_new();
BN_dec2bn(&bn[i], s[i]);
r[i] = BN_CTX_new();
}
bn[11] = BN_new();
BN_dec2bn(&bn[16], t);
for (i = 0; i < 16; i++)
{
BN_mul(bn[16], bn[16], bn[i], r[i]);
}
out = BN_bn2dec(bn[16]);
puts(out); //打印出字符串
for (i = 0; i < 16; i++)
{
BN_free(bn[i]);
BN_CTX_free(r[i]);
}
BN_free(bn[i]);
free(out);
return 0;
}
结果:
验证:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通