2014-05-06 48 views
0

我已經寫了RC4算法的以下實現,其中keyOpenSSL庫中給出的RC4_KEY結構。 m_key是包含設定密鑰的QByteArray。對於這個測試,我一直在使用「teste」作爲關鍵。如您所見,我還有兩個QByteArrays,其中一個保存原始(輸入)數據,另一個保存加密(輸出)數據。自己的RC4算法給出錯誤的輸出

void rc4SetKey() { 
    for (int i = 0; i < 256; ++i) { 
     key.data[i] = i; 
    } 
    for (int i = 0; i < 256; ++i) { 
     int j = (j + key.data[i] + m_key[i % m_key.length()]) % 256; 
     std::swap(key.data[i], key.data[j]); 
    } 
} 

void rc4Encrypt(QByteArray &in, QByteArray &out) { 
    out.clear(); 
    out.resize(in.length()); 
    for (int n = 0; n < in.length(); ++n) { 
     int i = (i + 1) % 256; 
     int j = (j + key.data[i]) % 256; 
     std::swap(key.data[i], key.data[j]); 
     int rand = key.data[(key.data[i] + key.data[j]) % 256]; 
     out[n] = rand^in[n]; 
    } 
} 

出於測試目的,我使用的是文本文件,用下面的數據(十六進制):

31 32 33 34 35 36 37 38 38 39 31 30 0a 

使用的online tool或OpenSSL的功能,我得到下面的輸出(關鍵:「泰斯特「):

6a 9d ae b6 17 61 7b 71 5f f7 46 f0 ab 

使用我自己的實現,但是,我得到如下:

52 ec c2 b1 3d ca 6b 55 50 54 30 e7 ed 

我花了相當一段時間,看了各種僞代碼或實現,但我仍然無法找出我出錯的地方。

回答

3

該表達式(在設定的密鑰和加密功能)是非法的(和所有警告編譯打開的時候已經指出了這一點):

int j = (j + ... 

除了是廢話(試圖引用它的初始化中的一個變量的值),它與算法定義不匹配 - j應該在循環外部聲明,並且在每次迭代時不重置。

以下內容應修復按鍵功能。加密功能的修復將幾乎相同(它也需要i以相同的方式修復)。

int j = 0; 
for (int i = 0; i < 256; ++i) { 
    j = (j + key.data[i] + m_key[i % m_key.length()]) % 256; 
    std::swap(key.data[i], key.data[j]); 
}