【问题标题】:Different hash values for identical input using different OpenSSL evp.h functions使用不同 OpenSSL evp.h 函数的相同输入的不同哈希值
【发布时间】:2021-10-25 17:57:47
【问题描述】:

使用下面的代码,为什么会得到不同的哈希值?

#include <iostream>
#include <cstring>
#include <openssl/evp.h>

# define SHA256_DIGEST_LENGTH    32


using namespace std;

static void hex_print(const char *name, const unsigned char *buf, size_t len)
{
    size_t i;
    fprintf(stdout, "%s ", name);
    for (i = 0; i < len; i++)
        fprintf(stdout, "%02X", buf[i]);
    fputs("\n", stdout);
}

int main (int argc, char *argv[]) 
{   
    EVP_MD_CTX *ctx;
    //const EVP_MD *evp_md = EVP_sha256();
    char *msg = (char*)"I have the high ground...";
    unsigned int msg_size = strlen(msg);
    unsigned char digest_a[SHA256_DIGEST_LENGTH] = {0};
    unsigned char digest_b[SHA256_DIGEST_LENGTH] = {0};

    cout << "message: " << msg << endl;
    cout << "length: " << msg_size << endl;

    ctx = EVP_MD_CTX_new();
    EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);
    EVP_DigestUpdate(ctx, msg, msg_size);
    EVP_DigestFinal_ex(ctx, digest_a, &msg_size);

    hex_print("sha256: ", digest_a, SHA256_DIGEST_LENGTH);

    
    EVP_Digest (msg, msg_size, digest_b, NULL, EVP_sha256 (), NULL);
    hex_print ("sha256: ", digest_b, SHA256_DIGEST_LENGTH);

    EVP_MD_CTX_free(ctx);

    return EXIT_SUCCESS;
}

使用 gcc 在 Ubuntu 20.04 LTS 上编译

g++ -Wall -g -o test test.cpp -I/usr/include/openssl -L/usr/lib/x86_64-linux-gnu l:libcrypto.so

输出:

message: I have the high ground...
length: 25
sha256:  2873FC569EFBE61AC67A1247CCBAE0AE94BE97D227D1ECEF3C9E93A8EA3CAD33
sha256:  F13852B3A521A6D08169AAA42525AA63FEF87D8A22418A25A8E19F3FD15E750D

当我将字符串粘贴到https://emn178.github.io/online-tools/sha256.html 等在线工具中时,“正确”的哈希值似乎是第一个:

2873fc569efbe61ac67a1247ccbae0ae94be97d227d1ecef3c9e93a8ea3cad33

谁能解释一下为什么会这样?谢谢!

【问题讨论】:

    标签: c++ openssl cryptography sha256 libssl


    【解决方案1】:

    调用EVP_DigestFinal_ex(ctx, digest_a, &amp;msg_size)msg_size覆盖为SHA256_DIGEST_LENGTH,不等于原来的25。

    然后您继续使用msg_size,就好像它仍然是原始值一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多