Почему эта функция SHA256 печатает некоторые странные символы? - PullRequest
1 голос
/ 03 июня 2011

Это код

#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.S Этот код не мой, я просто превратил его в отдельную программу для себя, но, как я уже сказал, печать хэша не удалась с некоторыми странными символами!

P.S2 SHA256 определен в библиотеке libcrypto библиотеки LibSSL. Программа компилируется с аргументом -lcrypto с использованием gcc.

1 Ответ

2 голосов
/ 03 июня 2011

Вывод хеша - почти всегда непрозрачные двоичные данные - то есть любые байты.

Вы пытаетесь распечатать их, как если бы они были text .Это означает, что он будет применять некоторую кодировку к двоичным данным, пытаясь интерпретировать их как текст.

В основном вам следует использовать противоположность hex2bin для преобразования произвольных двоичных данных в шестнадцатеричные.

...