0
我已經寫了RC4算法的以下實現,其中key
是OpenSSL庫中給出的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
我花了相當一段時間,看了各種僞代碼或實現,但我仍然無法找出我出錯的地方。