1. 程式人生 > 其它 >OpenSSL測試-大數

OpenSSL測試-大數

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[]="1315";

        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]={"20191310","20191311","20191312","20191313","20191314","20191315","20191316","20191317","20191318","20191319","20191320"};
        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;
}

bc驗證

可知結果正確