2014-04-05 110 views
3

我正嘗試從本網站編程SHA256實現:http://bradconte.com/sha256_c 在MSP430 MCU板中。我正在使用開源的Energia IDE進行編程。SHA256在c中的實現

這是testcode:

unsigned char hash[32]; 
SHA256_CTX ctx; 
sha256_init(&ctx); 
sha256_update(&ctx,(unsigned char*)"abc",3); 
sha256_final(&ctx,hash); 
PrintHex(hash); 

把它轉換爲十六進制

void PrintHex(unsigned char * data) 
{ 
    char tmp[16]; 
    for (int i=0; i<32; i++) { 
    sprintf(tmp, "%02x",data[i]); 
    Serial.print(tmp); 
    } 
} 

的問題是,輸出始終是一個錯誤的散列碼。

這是輸出:

2bb53935edbba17dc04a04854518754d8a66484491b585b0d0700cd2512f5420 

難道是testcode要不然,我做錯了什麼嗎?

+0

什麼是你預期的結果? –

+0

這是預計:'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'爲abc字符 – pattex007

+0

你可以在你的桌面上使用普通編譯器測試你的代碼,看看是否有效? –

回答

1

我跑的代碼我的系統(Mac OS X的x86 64位)上,它給了我:

551ce4769446b343295ea7f819ba1c5557545e29a4de545746b2b246a9831f22 

我認爲我們可以放心地假設代碼是胡扯:我覈實,ba7816b。 ..是使用一些在線工具的正確哈希,現在我們看到你的平臺和我的兩個產生不同的結果。我在代碼中注意到了一些關於排序的評論,所以我查了一下,你的系統也是小端的,所以這不應該是一個問題。我建議你尋找一個不同的實現。

+1

不是那麼快,問題是他認爲ulong恰好有32位 - 這對嵌入式系統可能是有意義的,但在大多數計算機上都失敗了;修復它給了我正確的結果。重新排序:它是否在任何地方說出他所在的平臺? – loreb

+0

@ pattex007萬一代碼確實無法使用,skalibs有一個聲明爲endianness獨立的實現,作者非常關心讓他的代碼在嵌入式系統上運行。 – loreb

+0

如何從「散列」變量中獲取摘要? –

1

你不應該承擔的字符串編碼是便攜式的C.

試試這個代碼,而不是:

unsigned char message[] = {0x61, 0x62, 0x63}; 
unsigned char hash[32]; 
SHA256_CTX ctx; 
sha256_init(&ctx); 
sha256_update(&ctx,message,sizeof message); 
sha256_final(&ctx,hash); 
PrintHex(hash);