首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重BIGNUM的散列

多重BIGNUM的散列
EN

Stack Overflow用户
提问于 2022-04-09 05:04:08
回答 1查看 35关注 0票数 -1

我需要使用OpenSSL在C/C++中对几个BIGNUM进行散列。

如果我假设我有10个BIGNUM,即n1,n2,.,n10和我想要将它们的散列计算为H(n1

我希望避免一个一个地转换成字符串,在缓冲区中复制,然后再执行散列操作。有什么建议/建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-09 05:43:06

您可以使用BN_bn2bin()获得一个字节表示,而不是将这些字节数组转换为字符串,并将这些字节数组顺序地提供给哈希函数,以获得所有值的最终哈希。

示例:

代码语言:javascript
复制
#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;
}

(当然,真正的代码应该包括错误检查。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71805384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档