如何实现SHA512 / 256 OpenSSL?

时间:2019-05-04 17:17:12

标签: c hash openssl

下面的代码是使用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哈希值(我想看看性能是否有所提高)尚不完全确定它是如何工作的,因此请您提前道歉!)

1 个答案:

答案 0 :(得分:2)

假设您使用的是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和基本构建功能的Linux中,您可以对其进行编译:

gcc evptest.c -l crypto -o evptest

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

./evptest
Digest sha512-256 is: dd889041ed0cf4ff7a1cf77dd384444b2de9347b032b95e64fc1955d889da8fd