2014-05-03 50 views
0

(這是一個後續問題Padding the message in SHA256)。我怎麼能一個64位整數轉換在C大端字節數組++

(我想實現在C SHA-256散列函數++。我這樣做純粹是爲了好玩和學習的目的。)

我有我的字符串message與長度message_length。我附加了字符串1後跟0 s,這樣字符串的長度現在是448位的mod 512位。

我現在需要追加字符串作爲64位big-endian整數message_length字符串,但我不能完全弄清楚如何在C++中做到這一點。

爲了說明方便,可以說message_length是3個字節= 24位。十六進制中的24是18,所以我需要在字符串中附加00 00 00 00 00 00 00 18

所以我想要的是一個函數,將整數3轉換爲字符串00 00 00 00 00 00 00 18,以便我可以附加此。

我的問題歸結爲

我怎麼能一個64位整數轉換在C大端字節數組++

+0

你的問題歸結爲:「我怎樣才能將一個64位整數轉換爲C++中的大端字節數組」。如果你這樣問,你會得到更好的結果,因爲不熟悉密碼學的讀者不會被SHA256的細節所忽略。 – Perseids

+0

@Perseids:謝謝你的建議。我編輯了這個問題。如果你能更清楚的話,隨意編輯更多。 – Thomas

+1

我確定在stackoverflow上一定有一些東西,但它深埋在地下:http:// stackoverflow。com/a/1701555/371137。而這個:https://stackoverflow.com/questions/1522994/store-an-int-in-a-char-array – Perseids

回答

1

編輯:我只是重讀你的問題(在打算編輯它)。我想你誤解了SHA256希望你使用的格式。您需要附加原始字節0x00,0x00,0x00,0x00,0x00,0x00,0x00和0x18,而不是追加字符串00 00 00 00 00 00 00 18(每個字節由空格編碼並用空格分隔),而不是附加原始字節0x00,0x00,0x00,0x00,0x00,0x00,0x00和0x18。它們不代表任何可打印的字符。請參閱下面的獲取這些字節的方法。我的例子使用一個整數,其字節表示恰巧只包含可打印字符(以ASCII形式)。

順便說一句,填充到448位的原因是在512位的完整塊大小中剩下64位,因此您可以將消息長度的大端編碼放在那裏。


可以使用num>>(8*i) & 0xff在這裏您將與i=7得到i=0和最顯著字節一個unsigned long(64位)的最顯著字節提取num一個字節。如果你需要它,你可以使用一個字符串的迭代器構造函數將其轉換爲字符串

unsigned long num = 0x626967656e646961L; 
    //Store big endian representation in a vector: 
    std::vector<unsigned char> bigEndian; 
    for(int i=7; i>=0; i--){ 
     bigEndian.push_back((num>>(8*i)) & 0xff); 
    } 

std::string bigEndianString(bigEndian.begin(),bigEndian.end()); 

與測試輸出完整代碼:通過所有位置進行遍歷,你可以得到每個字節

#include <iostream> 
#include <string> 
#include <vector> 
int main() { 
    unsigned long num = 0x626967656e646961L; 

    //Store big endian representation in a vector: 
    std::vector<unsigned char> bigEndian; 
    for(int i=7; i>=0; i--){ 
     bigEndian.push_back((num>>(8*i)) & 0xff); 
    } 

    //Convert vector to string: 
    std::string bigEndianString(bigEndian.begin(),bigEndian.end()); 

    //Test correctness: 
    for(std::vector<unsigned char>::const_iterator it = bigEndian.begin(); it != bigEndian.end(); ++it) { 
     std::cout << std::hex << (int)*it << ' '; 
    } 
    std::cout << std::endl << bigEndianString << std::endl; 

} 
相關問題