2

我正在尝试实现一个基本例程来对 BIGNUM(s) 执行一些计算,但我发现了一个奇怪的行为。功能如下

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

注意:一些数字被修剪以适应。我遵循了这里的建议。我错过了什么吗?有什么地方有错误吗?任何人都可以帮忙吗?

谢谢

编辑:

我对代码进行了一些修改,但问题仍然存在。我改变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_prime256v1as

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));
}

但代码在循环计算中产生相同的错误结果

4

1 回答 1

3

BN_hex2bn(&big_number, (char *)hex_s); 期望 C 字符串作为第二个参数,即 '\0' 终止的一个,因为它没有其他方法可以知道字符串的大小。

于 2013-03-12T17:52:14.380 回答