0

RC4 アルゴリズムの次の実装を作成しました。ここで、 はOpenSSLライブラリkeyで指定されている RC4_KEY 構造体です。セットキーを含む です。このテストでは、「teste」をキーとして使用しています。ご覧のとおり、さらに 2 つの があり、1 つは元の (入力) データを保持し、もう 1 つは暗号化された (出力) データを保持しています。m_keyQByteArrayQByteArrays

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];
    }
}

テスト目的で、次のデータ (16 進数) を含むテキスト ファイルを使用しています。

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

オンライン ツールまたは 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

私はかなりの時間を費やして、さまざまな疑似コードや実装を調べましたが、どこが間違っていたのかまだわかりません。

4

1 に答える 1