OpenSSL测试-大数

发布时间 2023-04-11 22:00:48作者: 西宁西

任务详情
在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>
//20201205
int main()
{
        BN_CTX *r[3];
        BIGNUM *a;
        BIGNUM *b;
        BIGNUM *c;
        char s[512+1] = "2";
        char t[512+1] = "4b5"; //1205
	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;
}

结果:

验证:

  1. 计算你以及前面5位同学和后面5位同学的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[11][9] = {"20201200", "20201201", "20201202", "20201203", "20201204", "20201205", "20201206", "20201207", "20201208", "20201209", "20201210"};
    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;
}

结果:


验证: