2017-11-11 893 views
0

我有一個小程序,它在64字節的大整數(通過BN_generate_prime_ex()生成)上使用BIGNUM函數BN_exp()和BN_mod_exp()。OpenSSL BN_exp()用法

每次我編譯並運行時,程序會在計算第​​一次調用BN_exp()時永遠暫停。我知道問題是BN_exp(),因爲我在函數調用之前和之後都有打印語句。我對計算BN_exp()時程序停滯的原因感到困惑。 64字節的大整數對於函數來說太大了嗎?計算是否花了很長時間?任何幫助表示讚賞。

目標:計算(bn_one^bn_two)*(bn_two^bn_one)mod bn_mod。我的方式是不正確的,所以關於如何計算這個的任何建議都會很棒。

這裏是我的程序:

#include <stdio.h> 

/* OpenSSL headers */ 
#include <openssl/bn.h> 

void main() 
{ 
    BIGNUM *bn_one, *bn_two, *bn_one2two, *bn_two2one, *bn_mod, *bn_result; 
    BN_CTX *ctx; /* used internally by the bignum lib */ 

    ctx = BN_CTX_new(); 
    bn_one = BN_new(); 
    bn_two = BN_new(); 
    bn_one2two = BN_new(); 
    bn_two2one = BN_new(); 
    bn_mod = BN_new(); 
    bn_result = BN_new(); 

    // Generate two 64 byte integers 
    BN_generate_prime_ex(bn_one,512,0,NULL,NULL,NULL); 
    BN_generate_prime_ex(bn_two,512,0,NULL,NULL,NULL); 
    BN_generate_prime_ex(bn_mod,512,0,NULL,NULL,NULL); 

    printf("BIGNUM One:\t"); 
    BN_print_fp(stdout, bn_one); 
    printf("\n"); 

    printf("BIGNUM Two:\t"); 
    BN_print_fp(stdout, bn_two); 
    printf("\n"); 

    // Compute bn_one to the power of bn_two and store in bn_one2two 
    if(BN_exp(bn_one2two , bn_one , bn_two, ctx) == 0) { 
     printf("Error in BN_exp\n"); 
    } 

    printf("BIGNUM One2Two:\t\n"); 
    BN_print_fp(stdout, bn_one2two); 
    printf("\n"); 

    // Compute bn_two to the power of bn_one and store in bn_two2one 
    if(BN_exp(bn_two2one , bn_two , bn_one, ctx) == 0) { 
     printf("Error in BN_exp\n"); 
    } 

    printf("BIGNUM Two2One:\t\n"); 
    BN_print_fp(stdout, bn_two2one); 
    printf("\n"); 

    // Compute bn_one2two * bn_two2one mod bn_mod and store the remainder in 
    //bn_result 
    if(BN_mod_mul(bn_result , bn_one2two , bn_two2one, bn_mod , ctx) == 0) { 
     printf("Error in BN_mod_exp\n"); 
    } 
    printf("BIGNUM Mod Result:\t\n"); 
    BN_print_fp(stdout, bn_result); 
    printf("\n"); 

    BN_CTX_free(ctx); 
    BN_clear_free(bn_one); 
    BN_clear_free(bn_two); 
    BN_clear_free(bn_one2two); 
    BN_clear_free(bn_two2one); 
    BN_clear_free(bn_mod); 
    BN_clear_free(bn_result); 
} 

程序攤位前,我的輸出(這64個字節的值,每次運行時更改):

BIGNUM一:CE06C8663AB65AA2BF7C6B30273C5E002552CFB8548A6B8EC7204A23F6A8892FEA9EF315777660C5B4FD97EABB7703FCFB5B1C2D495A1863B5F9D290F72CF8A5

BIGNUM二:CB4A929D982670B77F2544E7D5A990DEE76958CBEC5BEB638B8DA9D44880C46817D1D7616C58AF79378215368C76962FA88D08A215331019599945CAF933E417

+0

除非我誤會,否則結果將有512 * 2^512個二進制數字。這比適合任何計算機內存。 –

+0

我的目標是計算(bn_one^bn_two)*(bn_two^bn_one)mod bn_one,所以關於如何計算這個比我當前的方法更多的建議?謝謝。 –

+0

bn_one^bn_two是bn_one的倍數,所以結果應該爲零。 –

回答

0

我想出瞭如何正確計算(bn_one^bn_two)*(bn_one^bn_one)mod bn_mod:https://github.com/maK-/Digital-Signature-ElGamal/blob/master/Crypto2.java

以前,我是這樣計算的:bn_one^bn_two上的BN_exp,bn_two^bn_one上的BN_exp,bn_mod上的兩個結果上的BN_mod。

這些數字太大而無法用這種方式處理。用於BIGNUM的計算流程如下:bn_one上的BN_mod_exp()bn_mod上的bn_two,bn_two上的BN_mod_exp()bn_mod上的bn_one,上一個BN_mod_exp()計算結果上的BN_mul(),以及最後用BN_mod()對BN_mul()的結果與bn_mod進行比較。

1

你說你想要計算(bn_one2two * bn_two2one) mod bn_one,但是你正在使用BN_mod_exp函數,它將做(bn_one2two^bn_two2one) mod bn_one,即它首先試圖取指數而不是乘兩個數。改爲嘗試BN_mod_mul

+0

我的另一個錯誤。我相應地更新了代碼。謝謝。計算BN_exp()時,我的程序繼續失速。正如馬丁指出的那樣,我認爲這個問題是因爲我正在處理64字節整數,所以我在內存中存儲了太多的數字。 –