Реализация алгоритма Rc4

Мне нужно реализовать алгоритм Rc4 с семенем: 1 2 3 6 и криптологией обычного текста. Я следую этому руководству, которое мы предоставили в классе, но он неправильно инициализирует S. введите здесь описание изображения

мой вывод -  введите описание изображения здесь

и должен быть  введите описание изображения здесь

Мой код ранее печатал отрицательные значения, не знаю почему, но мне удалось исправить эту ошибку. Думал, все было хорошо, но это не так. Извините за картинки, но я решил, что легче объяснить, что я следую за своей структурой кода. Я модифицирую семя 4, поскольку оно содержит 4 символа, может ли это быть моей ошибкой?

#include <iostream>
#include <string>
#include <string.h>


using std::endl;
using std::string;

void swap(unsigned int *x, unsigned int *y);



int main()
{
string plaintext = "cryptology";

char cipherText[256] = { ' ' };
unsigned int S[256] = { 0 };
unsigned int t[256] = { 0 };
unsigned int seed[4] = { 1, 2, 3, 6 };      // seed used for test case 1 
unsigned int temp = 0;
int runningTotal = 0;

unsigned int key = 0;



// inilializing s and t
for (int i = 0; i < 256; i++)
{

    S[i] = i;
    t[i] = seed[i % 4];
}

for (int i = 0; i < 256; i++)
{
    runningTotal += S[i] + t[i];
    runningTotal %= 256;
    swap(&S[runningTotal], &S[i]);

     std::cout  << S[i] <<" ";
}
runningTotal = 0;

for (int i = 0; i < plaintext.size(); i++)
{
    runningTotal %= 256;
    swap(&S[i], &S[runningTotal]);

    temp = (unsigned int)S[i] + (unsigned int)S[runningTotal];
    temp %= 256;

    key = S[temp];
    std::cout << endl;
    cipherText[i] = plaintext[i] ^ key;



}
std::cout << " this is cipher text " << endl;
std::cout << cipherText << endl;






system("pause");
return 0;
}
void swap(unsigned int *x, unsigned int *y)
{
unsigned int temp = 0;

temp = *x;
*x = *y;
*y = temp;






}

person Thrall    schedule 27.01.2016    source источник


Ответы (1)


На самом деле я думаю, что вы генерируете S[] правильно. Могу только предположить, что вы должны сделать что-то другое с ключом. (Возможно, это строка ASCII вместо четырехбайтовых значений? Проверьте свои примечания к назначению.)

Однако позже возникает проблема. В цикле генерации потока вы должны выполнять операции увеличения и обмена перед получением байта из S[].

for (int k = 0; k < plaintext.size(); k++)
{
   i = (i+1) % 256;                             // increment S[] index
   runningTotal = (runningTotal + S[i]) % 256;  // swap bytes
   swap(&S[i], &S[runningTotal]);

   temp = (S[i] + S[runningTotal]) % 256;       // fetch byte from S and
   cipherText[k] = plaintext[k] ^ S[temp];      // XOR with plaintext
}

ПРИМЕЧАНИЕ. Хотя ваш код не имеет отношения к вашему вопросу, его можно было бы сделать более аккуратным, используя значения unsigned char вместо ints. Это устранило бы % 256 инструкции, которые валяются повсюду. (Но будьте осторожны во время инициализации, потому что i<256 всегда будет истинным, если i равно unsigned char.)

person r3mainer    schedule 27.01.2016