自己的RC4算法给出了错误的输出

时间:2014-05-06 19:52:22

标签: c++ rc4-cipher

我编写了以下RC4算法实现,其中keyOpenSSL库中给出的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

我现在花了很长时间看了各种伪代码或实现,但我仍然无法弄清楚我哪里出错了。

1 个答案:

答案 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]);
}