【问题标题】:C - SHA256 Generation does not output the correct hash?C - SHA256 生成不输出正确的哈希?
【发布时间】:2021-03-18 02:27:43
【问题描述】:

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

我的实现:

Pizza is great! -> 86b01bb0cf966fec8f4864103538359cf5d9b6387ef710e02413a11dcce2e489

在线生成器:

Pizza is great! -> 5f5c21c95db335c9e2cedd132e294102a8af08c1ddf81f41c9d54c421cfca1da

我正在使用的代码:

我不能在这个项目中使用 OpenSSL,所以我使用这个 SHA256 实现:sha256.csha256.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;
}

【问题讨论】:

  • 如果改用sha256_update(&amp;ctx, message, strlen(message)); 会怎样?

标签: c encryption cryptography


【解决方案1】:

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

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

看这个节目:

#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 个字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2019-03-03
    • 2016-08-20
    • 2015-12-23
    • 2019-11-10
    • 2016-10-10
    相关资源
    最近更新 更多