【问题标题】:Why is this SHA256 function printing some weird characters?为什么这个 SHA256 函数会打印一些奇怪的字符?
【发布时间】:2011-06-04 03:06:09
【问题描述】:

这是代码

#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 哈希值(两次,同时在实际哈希它之前做各种事情)。 尽管程序编译、运行并获取字符串,但它会输出一些奇怪的字符而不是哈希。 为什么会这样?

附言 这段代码不是我的,我只是为自己制作了一个单独的程序,但就像我说的,打印哈希失败并带有一些奇怪的字符!

P.S2 SHA256 在 LibSSL 的 libcrypto 库中定义。该程序是使用 gcc 使用 -lcrypto 参数编译的。

【问题讨论】:

    标签: c sha256


    【解决方案1】:

    散列的输出几乎总是不透明的二进制数据——即任何个字节。

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

    基本上你应该使用 hex2bin 的反义词来将任意二进制数据转换为十六进制。

    【讨论】:

    • 好吧,就像我说的,代码不是我的,我只是或多或少地将它放到了一个单独的程序中。所以做 hex2bin 的逆操作有点……在我头上说。
    • 将此哈希打印为十六进制非常容易; for(int i = 0; i &lt; sizeof hash1 ; i++) { printf("%02x",hash1[i]); }
    • 不,等等,它有效。我还没有习惯整个 linux 的东西。
    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多