为什么这个SHA256函数打印出一些奇怪的字符?

3
这是代码。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <byteswap.h>
#include "/usr/include/openssl/sha.h"
#include <evhttp.h>

bool hex2bin(unsigned char *p, const char *hexstr, size_t len);

bool hex2bin(unsigned char *p, const char *hexstr, size_t len)
{
while (*hexstr && len) {
    char hex_byte[3];
    unsigned int v;

    if (!hexstr[1]) {
        //applog(LOG_ERR, "hex2bin str truncated");
        return false;
    }

    hex_byte[0] = hexstr[0];
    hex_byte[1] = hexstr[1];
    hex_byte[2] = 0;

    if (sscanf(hex_byte, "%x", &v) != 1) {
        //applog(LOG_ERR, "hex2bin sscanf '%s' failed",
            //hex_byte);
        return false;
    }

    *p = (unsigned char) v;

    p++;
    hexstr += 2;
    len--;
}

return (len == 0 && *hexstr == 0) ? true : false;
}

int main(int argc, char **argv)
{
unsigned char hash[SHA256_DIGEST_LENGTH], hash1[SHA256_DIGEST_LENGTH];
uint32_t *hash32 = (uint32_t *) hash;
unsigned char data[128];
uint32_t *data32 = (uint32_t *) data;
int i;

   hex2bin(data, argv[1], sizeof(data));

for (i = 0; i < 128/4; i++)
    data32[i] = bswap_32(data32[i]);

SHA256(data, 80, hash1);
SHA256(hash1, SHA256_DIGEST_LENGTH, hash);

printf("%s\n\n",hash1);

return 0;   
}

抱歉代码很长。不要在意不必要的包含文件,我只是不确定哪些需要,所以无论如何都进行了编译。
这是用C语言编写的程序,在Linux下运行,Ubuntu 11.04。
该程序以某个字符串作为参数,并必须计算它的sha256哈希值(在实际哈希之前进行各种处理,包括两次哈希)。 尽管程序编译、运行并接收字符串,但却输出一些奇怪的字符而不是哈希值。 为什么会这样?
附言: 这段代码不是我写的,我只是将其制作成一个单独的程序供自己使用,但就像我所说的,打印哈希值失败了,出现了一些奇怪的字符!
附言2: SHA256在LibSSL的libcrypto库中定义。该程序使用gcc编译时,使用-lcrypto参数。
1个回答

5

哈希的输出几乎总是不透明的二进制数据,即任何字节。

您正在尝试将它们打印为文本。这意味着它将对二进制数据应用某种编码,尝试将其解释为文本。

基本上,您应该使用与hex2bin相反的方法,将任意二进制数据转换为十六进制。


好的,就像我说的一样,这段代码不是我的,我只是将它放到了一个单独的程序中。所以说,进行 hex2bin 的反转换有点超出我的能力范围。 - dikidera
3
将该哈希值以十六进制形式打印很容易;for(int i = 0; i < sizeof hash1 ; i++) { printf("%02x",hash1[i]); } - nos
不行,等等,它可以工作了。我还没有完全适应Linux的整个操作系统。 - dikidera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接