C - SHA256 生成不输出正确的散列?

C - SHA256 Generation does not output the correct hash?

我正在尝试生成哈希,但我总是得到不同的结果。

我的实现:

Pizza is great! -> 86b01bb0cf966fec8f4864103538359cf5d9b6387ef710e02413a11dcce2e489

在线生成器:

Pizza is great! -> 5f5c21c95db335c9e2cedd132e294102a8af08c1ddf81f41c9d54c421cfca1da

我使用的代码:

我不能为这个项目使用 OpenSSL,所以我使用这个 SHA256 实现:sha256.c sha256.h

int GenerateKey() {
    unsigned char message[] = "Pizza is great!";
    unsigned char hash[SHA256_BLOCK_SIZE];
    
    SHA256_CTX ctx;
    
    sha256_init(&ctx);
    sha256_update(&ctx, message, sizeof(message));
    sha256_final(&ctx, hash);
    
    printf("SHA256 KEY\n\n\n\n\n");
    
    int i;
    for (i = 0; i < SHA256_BLOCK_SIZE; i++) {
        printf("%02x", hash[i]);
    }
    
    printf("\n\n\n\n\n");
    
    return 0;
}

如前所述,区别在于使用 sizeof(message)strlen(message)

sizeof 声明的数组 (char message[]) 包括字符串末尾的空值(值为 0 的终止字符),而 strlen 不包括终止空值。

查看此程序:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){

    char message[] = "Pizza is great!";
    printf("sizeof(message) is %ld\n", sizeof(message));
    printf("strlen(message) is %ld\n", strlen(message));

    return 0;
}

输出为:

sizeof(message) is 16
strlen(message) is 15

顺便说一句,值得注意的是,您是这样声明字符串数组的:

char *message = "Pizza is great!"

并调用 sizeof(message),您将实际获得指针的大小,该大小取决于平台,为 4 或 8 个字节。