2011-06-03 60 views
1

這是代碼這個SHA256函數爲什麼會打印一些奇怪的字符?

#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在LibSSL的libcrypto庫中定義。該程序使用gcc使用-lcrypto參數進行編譯。

回答

2

散列的輸出幾乎總是不透明的二進制數據 - 即任何字節。

您正在嘗試打印這些文件,好像它們是文本。這意味着它將對二進制數據應用一些編碼,試圖將其解釋爲文本。

基本上你應該使用hex2bin的反義詞來將任意二進制數據轉換爲十六進制。

+0

好吧,就像我說的,代碼不是我的,我只是或多或少地把它放到一個單獨的程序中。所以做hex2bin的反面有點......在我頭上說。 – dikidera 2011-06-03 19:07:28

+3

以十六進制打印此散列很容易; 'for(int i = 0; i nos 2011-06-03 19:11:54

+0

我試過了,但仍然沒有骰子,我仍然可以看到二進制數據。 – dikidera 2011-06-03 19:21:46

相關問題