2012-03-30 44 views
1

我對密碼學非常感興趣,並且由於我也喜歡編程,所以我決定使用XTEA加密算法來製作一個小程序來加密文件。 我從Wikipedia靈感,所以我寫了這個函數來完成加密(爲了節省空間,我將不會發布解密功能,因爲它幾乎是相同的):使用XTEA加密函數的類型

void encipher(long *v, long *k) 
{ 
    long v0 = v[0], v1 = v[1]; 
    long sum = 0; 
    long delta = 0x9e3779b9; 
    short rounds = 32; 
    for(uint32 i = 0; i<rounds; i++) 
    { 
     v0 += (((v1 << 4)^(v1 >> 5)) + v1)^(sum + k[sum & 3]); 
     sum += delta; 
     v1 += (((v0 << 4)^(v0 >> 5)) + v0)^(sum + k[(sum>>11) & 3]); 
    } 
    v[0] = v1; 
    v[1] = v1; 
} 

現在,當我想使用它,我寫了這個代碼:

long data[2]; // v0 and v1, 64bits 
data[0] = 1; 
data[1] = 1; 

long key[4]; // 4 * 4 bytes = 16bytes = 128bits 
*key = 123; // sets the key 

cout << "READ: \t\t" << data[0] << endl << "\t\t" << data[1] << endl; 
encipher(data, key); 
cout << "ENCIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

decipher(data, key); 
cout << "DECIPHERED: \t" << data[0] << endl << "\t\t" << data[1] << endl; 

我總是要麼運行時崩潰或錯誤的解密文本: enter image description here

我理解程序的基礎知識,但我真的不知道是什麼我的代碼錯了。爲什麼加密的數據[0]和數據1一樣?爲什麼破解的數據與起始數據完全不同?我使用的類型是否錯誤? 我希望你能幫助我解決我的問題:)。

回答

4

的問題是在這裏:

v[0] = v1; // should be v[0] = v0 
v[1] = v1; 

此外,只設置了前4個字節的關鍵。其餘12個字節未初始化。 嘗試是這樣的:

key[0] = 0x12345678; 
key[1] = 0x90ABCDEF; 
key[2] = 0xFEDCBA09; 
key[3] = 0x87654321; 

The fixed code給了我這樣的輸出:

READ:   1 
       1 
ENCIPHERED:  -303182565 
       -1255815002 
DECIPHERED:  1 
       1 
+0

感謝您的回答! 我可以在v1和v0中看到我的愚蠢錯誤。 您能否介紹一下密鑰中字節的設置?我對真正的十六進制並不十分了解,但是我不能只將鍵[1 ... 3]設置爲0? 不幸的是,你的回答並沒有解決主要問題,但我相信它有很大幫助! – Janman 2012-03-30 18:28:29

+0

@Janman:當然你可以將鍵[1],鍵[2]和鍵[3]設置爲0,但你需要將它們設置爲* something *。如果你沒有將它們設置爲任何它們沒有被初始化的東西,並且只會在該部分內存中隨機獲得任何值。它是否適用於變化? 「解密」中可能有類似的問題嗎? – 2012-03-30 19:05:41

+0

非常感謝,現在我做到了。如果我可能還有一個小問題: 當我想從文件中讀取數據時,我可以使用:'myIfstream.readsome((char *)&data [0],4)''''然後使用這個過程來加密它? – Janman 2012-03-30 19:22:19