2013-03-29 54 views
0

我正在對可執行文件執行MD5散列。我使用python腳本從可執行文件讀取二進制文件到一個文本文件中,但是如果我將這個構造文件讀入C程序,我將處理MB的數據,因爲這些數據和零被視爲每個1位數字取8位。是否有可能將它們分別單獨讀入?如果我製作了一個10MB的數組來保存所需要的二進制轉換和填充的所有字符,程序的性能會有多糟糕?如果這是不可想象的,是否有更好的方式來操縱數據?如何訪問數百萬位的散列

+1

首先,不要使用MD5 - 在這個時代使用它沒有合理的藉口。 –

+1

這是我正在做的研究的第一步。最重要的是熟悉哈希。之後我們將轉換爲更好的哈希算法。 – Dolphiniac

+1

沒有任何意義 - 基本上你所做的一切(或者你所提到的所有內容)都是哈希算法。所以基本上,你說的是做一些事情,然後把它徹底扔掉,從第一天開始。如果你從一個1和0的字符串開始,就像你所描述的那樣,這會更加真實。 –

回答

1

由於您所標記的問題C和C++,我會去C.

是否有可能在各單位閱讀這些?

是的,剛讀8個字節從文件時間和串聯這些1 S和0 s到做一個新的字節。你不需要爲此製作一個10MB的陣列。

首先,從文件中讀取8個字節。讀取的char值將被轉換爲整數值(01),然後進行移位以創建新的字節。

unsigned char bits[8]; 
while (fread(bits, 1, 8, file) == 8) { 
    for (unsigned int i = 0; i < 8; i++) { 
     bits[i] -= '0'; 
    } 

    char byte = (bits[0] << 7) | (bits[1] << 6) | 
       (bits[2] << 5) | (bits[3] << 4) | 
       (bits[4] << 3) | (bits[5] << 2) | 
       (bits[6] << 1) | (bits[7] ); 

    /* update MD5 Hash here */ 
} 

然後,您將用新讀取的字節更新您的MD5哈希值。


編輯:由於典型的MD5的實現將不得不把輸入到處理前512位數據塊,你可以擺脫在執行本身(不推薦雖然)是開銷,和剛讀512位(64字節),然後直接更新散列。

unsigned char buffer[64]; 
unsigned char bits[8]; 
unsigned int index = 0; 

while (fread(bits, 1, 8, file) == 8) { 
    for (unsigned int i = 0; i < 8; i++) { 
     bits[i] -= '0'; 
    } 

    buffer[index++] = (bits[0] << 7) | (bits[1] << 6) | 
         (bits[2] << 5) | (bits[3] << 4) | 
         (bits[4] << 3) | (bits[5] << 2) | 
         (bits[6] << 1) | (bits[7] ); 

    if (index == 64) { 
     index = 0; 
     /* update MD5 hash with 64 byte buffer */ 
    } 
} 

/* This sends the remaining data to the MD5 hash function */ 
/* It's not likely that your file has exactly 512N chars */ 
if (index != 0) { 
    while (index != 64) { 
     buffer[index++] = 0; 
    } 
    /* update MD5 hash with the padded buffer. */ 
} 
+0

就我個人而言,我會拍攝(8 * N)個字符,其中N是底層哈希算法的塊大小。例如,SHA-1具有512位塊大小,SHA-2(224,256)同樣是512位,SHA-2(384/512)是1024位等等。 – WhozCraig

+0

這是一個不錯的主意。在這種情況下,他必須在更新哈希之前讀取64個字節。這樣,他不需要將輸入處理爲512位塊的開銷。 –

+0

他不會*擁有*,但任何自我尊重的散列算法實現只是坐在數據上,直到塊大小滿或終結器被觸發。例如,對於SHA-1,讀取8 * 512個字符,將它們拼成字節,然後提交該塊可能至少有助於減少hash-api調用的數量。當然,如果內存是合理的,你可以通過一個過濾器來填充std :: vector 與真實的字節,一旦你完成了你的位文件,發送在單個散列+最終化中的向量。 – WhozCraig