多个 BIGNUM 的哈希
Hash of Multiple BIGNUM
我需要使用 OpenSSL 在 C/C++ 中对几个 BIGNUM 进行哈希运算。
如果我假设我有 10 个 BIGNUM,即 n1、n2、...、n10,并且我想将它们的散列计算为 H(n1||n2||...||n10),有快速的方法吗?
我想避免将一个一个地转换成字符串,复制到缓冲区中,然后再进行散列。任何 suggestion/recommendation?
无需将 bignum 转换为字符串,您可以使用 BN_bn2bin()
获得字节表示,并将这些字节数组按顺序提供给哈希函数以获得所有值的最终哈希值。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/evp.h>
int main(void) {
BIGNUM *bns[3];
bns[0] = BN_new();
bns[1] = BN_new();
bns[2] = BN_new();
BN_set_word(bns[0], 10);
BN_set_word(bns[1], 50);
BN_set_word(bns[2], 150);
EVP_MD_CTX *hash_ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(hash_ctx, EVP_sha256(), NULL);
unsigned char *bytes = NULL;
for (int n = 0; n < 3; n++) {
size_t size = BN_num_bytes(bns[n]);
bytes = realloc(bytes, size);
BN_bn2bin(bns[n], bytes);
EVP_DigestUpdate(hash_ctx, bytes, size);
}
free(bytes);
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);
for (unsigned n = 0; n < hash_size; n++) {
printf("%02hhx", hash[n]);
}
putchar('\n');
return 0;
}
(真正的代码当然应该包括错误检查。)
我需要使用 OpenSSL 在 C/C++ 中对几个 BIGNUM 进行哈希运算。
如果我假设我有 10 个 BIGNUM,即 n1、n2、...、n10,并且我想将它们的散列计算为 H(n1||n2||...||n10),有快速的方法吗?
我想避免将一个一个地转换成字符串,复制到缓冲区中,然后再进行散列。任何 suggestion/recommendation?
无需将 bignum 转换为字符串,您可以使用 BN_bn2bin()
获得字节表示,并将这些字节数组按顺序提供给哈希函数以获得所有值的最终哈希值。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <openssl/bn.h>
#include <openssl/evp.h>
int main(void) {
BIGNUM *bns[3];
bns[0] = BN_new();
bns[1] = BN_new();
bns[2] = BN_new();
BN_set_word(bns[0], 10);
BN_set_word(bns[1], 50);
BN_set_word(bns[2], 150);
EVP_MD_CTX *hash_ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(hash_ctx, EVP_sha256(), NULL);
unsigned char *bytes = NULL;
for (int n = 0; n < 3; n++) {
size_t size = BN_num_bytes(bns[n]);
bytes = realloc(bytes, size);
BN_bn2bin(bns[n], bytes);
EVP_DigestUpdate(hash_ctx, bytes, size);
}
free(bytes);
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);
for (unsigned n = 0; n < hash_size; n++) {
printf("%02hhx", hash[n]);
}
putchar('\n');
return 0;
}
(真正的代码当然应该包括错误检查。)