【问题标题】:How to implement SHA512/256 OpenSSL?如何实现 SHA512/256 OpenSSL?
【发布时间】:2019-05-04 17:17:11
【问题描述】:

下面的代码是使用 OpenSSL 计算 SHA152 哈希的方法,但是根据更新日志,OpenSSL 已经支持 SHA512/256 有一段时间了 - 问题是我找不到有关如何使用它的信息?!如果有人知道怎么做,如果您能告诉我怎么做,我将不胜感激。

SHA512_Init (&mdContext);
while ((bytes = fread (data, 1, 1024, inFile)) != 0)
    SHA512_Update (&mdContext, data, bytes);
SHA512_Final (c,&mdContext);
for(i = 0; i < SHA512_DIGEST_LENGTH; i++) printf("%02x", c[i]);
printf (" %s\n", filename);
return 0;

(这段代码只是一个例子,我知道它不会像那样运行)

编辑: 我刚刚将SHA512_DIGEST_LENGTH 更改为SHA256_DIGEST_LENGTH,这是正确的方法吗?我担心这仍然会计算整个 SHA512 哈希(我想看看是否有性能提升)不完全确定它是如何工作的,所以提前道歉!)

【问题讨论】:

  • SHA512/256 是“用不同的内部 IV 计算 SHA512,然后取输出的最左边 256 位”,所以方法是不是 只需更改您打印的SHA512_Final 输出的位数。我不知道实际上是什么方法。不管它实际上是什么,它涉及计算整个 512 位哈希,然后丢弃其中的一半;奇怪的是,在某些 CPU 上,这仍然比计算 SHA256 更快。
  • 如果您使用的是 OpenSSL 1.1.1,我相信执行此操作的正确方法是通过 EVP 系列(坦率地说,无论如何您都应该使用它),特别是使用 EVP_sha512_256 摘要方法。如果你使用 OpenSSL 1.1.1,我认为你根本做不到。

标签: c hash openssl


【解决方案1】:

假设你使用的是linux环境,可以参考下面的sha512-256示例(evptest.c):

#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
#define DIGEST_NAME "sha512-256"

int main(int argc, char *argv[]) {
  EVP_MD_CTX *mdctx;
  const EVP_MD *md;
  char mess1[] = "Test Message\n";
  char mess2[] = "Hello World\n";
  unsigned char md_value[EVP_MAX_MD_SIZE];
  int md_len, i;

  OpenSSL_add_all_digests();
  md = EVP_get_digestbyname(DIGEST_NAME);
  if(!md) {
    printf("Unknown message digest %s\n", DIGEST_NAME);
    exit(1);
  }
  mdctx = EVP_MD_CTX_create();
  EVP_DigestInit_ex(mdctx, md, NULL);
  EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
  EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
  EVP_DigestFinal_ex(mdctx, md_value, &md_len);
  EVP_MD_CTX_destroy(mdctx);

  printf("Digest %s is: ", DIGEST_NAME);
  for(i = 0; i < md_len; i++)
    printf("%02x", md_value[i]);
  printf("\n");

  /* Call this once before exit. */
  EVP_cleanup();
  exit(0);
}

在具有最新 OpenSSL 和 build-essential 的 Linux 中,您可以编译它:

gcc evptest.c -l crypto -o evptest

然后执行 evptest 二进制文件,你会看到 sha512-256 结果

./evptest
Digest sha512-256 is: dd889041ed0cf4ff7a1cf77dd384444b2de9347b032b95e64fc1955d889da8fd

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 2023-04-04
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2022-08-17
    相关资源
    最近更新 更多