我编写了以下RC4算法实现,其中key
是OpenSSL库中给出的RC4_KEY结构。 m_key
是包含设置密钥的QByteArray
。对于这个测试,我一直使用“teste”作为关键。如您所见,我还有两个QByteArrays
,其中一个持有原始(输入)数据,另一个持有加密(输出)数据。
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函数,我得到以下输出(键:“teste”):
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
我现在花了很长时间看了各种伪代码或实现,但我仍然无法弄清楚我哪里出错了。
答案 0 :(得分:3)
此表达式(在set-key和encrypt函数中)都是非法的(编译时打开的所有警告都应该指出):
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]);
}