哈希到 Bignum - unsigned char[] 到 char *

Hash to Bignum - unsigned char[] to char *

我需要将当前哈希值导出到一个 BIGNUM 中。我在 C 中使用 OpenSSL。当我尝试执行此操作并使用 BN_print 打印 h 的内容时,我将 0 作为输出。如下代码片段:

BIGNUM *h;
h = BN_new();
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned hash_size = EVP_MAX_MD_SIZE;
EVP_DigestFinal_ex(hash_ctx, hash, &hash_size);
EVP_MD_CTX_free(hash_ctx);

// printing
for (unsigned n = 0; n < hash_size; n++) {
    printf("%02hhx", hash[n]);
}

BN_hex2bn(&h, hash);
printf("\n");
BN_print(bio_out, h);

函数 BN_hex2bn(BIGNUM **a, const char *str); 在输入中接受一个指向 BIGNUM 的指针和一个指向 a const char 的指针。我需要转换它吗?如果是,最好的方法是什么?

BN_hex2bn 采用值的文本表示。 您必须将哈希值转换为十六进制的文本表示形式:

unsigned char hash[EVP_MAX_MD_SIZE];
unsigned hash_size = EVP_MAX_MD_SIZE;
EVP_DigestFinal_ex(hash_ctx, hash, &hash_size);
EVP_MD_CTX_free(hash_ctx);

// hex conversion
unsigned char hash_text[2 * EVP_MAX_MD_SIZE + 1];
static char const hexdigits[16] = "0123456789abcdef";
for (unsigned n = 0; n < hash_size; n++) {
    hash_text[2 * n + 0] = hexdigits[hash[n] >> 4];
    hash_text[2 * n + 1] = hexdigits[hash[n] & 15];
}
hash_text[2 * hash_size] = '[=10=]';

// printing
printf("%s\n", hash_text);

// BIGNUM conversion
BIGNUM *h = BN_new();
BN_hex2bn(&h, hash);
BN_print(bio_out, h);

您也可以使用 BN_bin2bn:

直接从大端二进制数据初始化 BIGNUM
// BIGNUM conversion
BIGNUM *h = BN_new();
BN_bin2bn(hash, hash_size, h);
BN_print(bio_out, h);

或更简单:

// BIGNUM conversion
BIGNUM *h = BN_bin2bn(hash, hash_size, NULL);
BN_print(bio_out, h);