2013-03-11 26 views
2

我想實現一個基本的例程來對BIGNUM(s)執行一些計算,我發現了一個奇怪的行爲。的功能如下BIGNUM在計算循環中的奇怪行爲

unsigned char *char_array_as_hex(unsigned char *chr_a, int len) 
{ 
    unsigned char *chr_s = (unsigned char *)malloc(len * 2); 
    char buffer[5]; 

    for (int i = 0; i < len; i++) 
    { 
     sprintf(buffer, "%02X", chr_a[i]); 
     chr_s[(2 * i) + 0] = buffer[0]; 
     chr_s[(2 * i) + 1] = buffer[1]; 
    } 

    return chr_s; 
} 

char *big_number_as_decimal_from_hex_array(unsigned char *chr_a, int len, BN_CTX *bn_ctx) 
{ 
    unsigned char *hex_s = char_array_as_hex(chr_a, len); 
    BIGNUM *big_number = BN_CTX_get(bn_ctx); 
    BN_hex2bn(&big_number, (char *)hex_s); 
    char *big_number_as_decimal = BN_bn2dec(big_number); 

    free(hex_s); 
    BN_free(big_number); 

    return big_number_as_decimal; 
} 

void test_compute_prime256v1() 
{ 
    BN_CTX *bn_ctx = BN_CTX_new(); 
    BN_CTX_start(bn_ctx); 

    unsigned char seed_a[20] = { 
     0xC4,0x9D,0x36,0x08,0x86,0xE7,0x04,0x93,0x6A,0x66, /* seed */ 
     0x78,0xE1,0x13,0x9D,0x26,0xB7,0x81,0x9F,0x7E,0x90 
    }; 
    printf("s = %s\n", big_number_as_decimal_from_hex_array(seed_a, 20, bn_ctx)); 

    unsigned char p_a[32] = { 
     0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x01,0x00,0x00, /* p */ 
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 
     0xFF,0xFF 
    }; 
    printf("p = %s\n", big_number_as_decimal_from_hex_array(p_a, 32, bn_ctx)); 

    BN_CTX_end(bn_ctx); 
    BN_CTX_free(bn_ctx); 
} 

然後調用在一個Objective-C方法 「test_compute_prime256v1」。如果我與每個之間的合理的延遲一次或多次調用它調用但是它產生正確的結果,當我調用該函數在一個循環中它產生不同的值不正確

- (IBAction)btnOK_Clicked:(id)sender 
{ 
    for (int i = 1; i < 10; i++) 
    { 
     printf("i = %d\n", i); 
     test_compute_prime256v1(); 
    } 
} 

和一個樣本輸出端是

i = 1 
s = 1122468115042657169822351801880191947498376363664 
p = 115792089210356248762697446949407573530086143415290314195533631308867097853951 
i = 2 
s = 1122468115042657169822351801880191947498376363664 
p = 966134380529368896499052403318808180610643774633026536153469502543482958881555881553276... 
i = 3 
s = 1122468115042657169822351801880191947498376363664 
p = 115792089210356248762697446949407573530086143415290314195533631308867097853951 

注意:有些數字被修剪以適應。我遵循here中的建議。 我錯過了什麼嗎?某處有什麼錯誤嗎? 任何人都可以提供幫助嗎?

感謝

編輯:

我做了一些修改代碼,但問題仍然存在。我改變big_number_as_decimal_from_hex_array如下

char *big_number_as_decimal_from_hex_array_ex(unsigned char *chr_a, int len) 
{ 
    BN_CTX *bn_ctx = BN_CTX_new(); 
    BN_CTX_start(bn_ctx); 
    unsigned char *hex_s = char_array_as_hex(chr_a, len); 
    BIGNUM *big_number = BN_CTX_get(bn_ctx); 
    BN_hex2bn(&big_number, (char *)hex_s); 
    char *big_number_as_decimal = BN_bn2dec(big_number); 

    free(hex_s); 
    BN_free(big_number); 
    BN_CTX_end(bn_ctx); 
    BN_CTX_free(bn_ctx); 

    return big_number_as_decimal; 
} 

並且還

char *big_number_as_decimal_from_hex_array_ex_2(unsigned char *chr_a, int len) 
{ 
    BN_CTX *bn_ctx = BN_CTX_new(); 
    unsigned char *hex_s = char_array_as_hex(chr_a, len); 
    BIGNUM *big_number = BN_CTX_get(bn_ctx); 
    BN_hex2bn(&big_number, (char *)hex_s); 
    char *big_number_as_decimal = BN_bn2dec(big_number); 

    free(hex_s); 
    BN_free(big_number); 
    BN_CTX_free(bn_ctx); 

    return big_number_as_decimal; 
} 

我修改test_compute_prime256v1作爲

void test_compute_prime256v1_ex() 
{ 
    unsigned char seed_a[20] = {...}; 
    printf("s = %s\n", big_number_as_decimal_from_hex_array_ex(seed_a, 20)); 
    unsigned char p_a[32] = {...}; 
    printf("p = %s\n", big_number_as_decimal_from_hex_array_ex(p_a, 32)); 
     // or 
    unsigned char seed_a[20] = {...}; 
    printf("s = %s\n", big_number_as_decimal_from_hex_array_ex_2(seed_a, 20)); 
    unsigned char p_a[32] = {...}; 
    printf("p = %s\n", big_number_as_decimal_from_hex_array_ex_2(p_a, 32)); 
} 

但代碼產生相同的不正確的結果在環狀計算

+0

我在linux下測試你的代碼gcc 64位並沒有得到任何奇怪的結果。我沒有使用任何gui,所以在gui驅動的回調中沒有調用代碼。 – 2013-03-11 20:31:22

+0

快速猜測將重置s計算和p之間的上下文或從兩個bignumber直接得到,因爲http://www.openssl.org/docs/crypto/BN_CTX_start.html聲明'必須在調用之前調用所有BN_CTX_get()調用任何其他使用ctx作爲參數的函數。' – 2013-03-11 20:54:20

+0

我修改了代碼以反映您的建議,但結果仍然相同。它在循環計算中產生不正確的結果。我已經在mac-os-x lion 64bit下的iOS 6.0模擬器(iPhone 5.0)上對它進行了測試。 – anonim 2013-03-12 07:30:42

回答

3

BN_hex2bn (& big_number,(char *)he X_S);期望一個C字符串作爲第二個參數,即'\ 0'終止,因爲它沒有其他方法來知道你的字符串的大小。

+0

謝謝,Open SSL文檔太糟糕了,我作爲一個新手犯了這樣的錯誤。再次感謝 – anonim 2013-03-12 22:23:19