Краткое описание алгоритма RC4.
Ядро алгоритма состоит из функции генерации ключевого потока. Эта функция генерирует последовательность битов ( ), которая затем объединяется с открытым текстом ( ) посредством суммирования по модулю два. Так получается шифрограмма ( ):
.
Расшифровка заключается в регенерации этого ключевого потока ( ) и сложении его и шифрограммы ( ) по модулю два. В силу свойств суммирования по модулю два на выходе мы получим исходный незашифрованный текст( ):
![](https://konspekta.net/stydopediaru/baza2/202872315860.files/image059.gif)
Другая главная часть алгоритма — функция инициализации, которая использует ключ переменной длины для создания начального состояния генератора ключевого потока.
RC4 — фактически класс алгоритмов, определяемых размером его блока. Этот параметр n является размером слова для алгоритма. Обычно, n = 8, но в целях анализа можно уменьшить его. Однако для повышения безопасности необходимо увеличить эту величину. Внутреннее состояние RC4 представляется в виде массива слов размером 2n и двух счетчиков, каждый размером в одно слово. Массив известен как S-бокс, и далее будет обозначаться как S. Он всегда содержит перестановку 2n возможных значений слова. Два счетчика обозначены через i и j.
Алгоритм инициализации RC4 приведен ниже. Этот алгоритм также называется алгоритмом ключевого расписания (англ. Key-Scheduling Algorithm or KSA). Этот алгоритм использует ключ, сохраненный в Key, и имеющий длину L байт. Инициализация начинается с заполнения массива S, далее этот массив перемешивается путем перестановок, определяемых ключом. Так как только одно действие выполняется над S, то должно выполняться утверждение, что Sвсегда содержит все значения кодового слова.
![](https://konspekta.net/stydopediaru/baza2/202872315860.files/image061.jpg)
Генератор ключевого потока RC4 переставляет значения, хранящиеся в S, и каждый раз выбирает различное значение из S в качестве результата. В одном цикле RC4 определяется одно n-битное слово K из ключевого потока, которое в последующем суммируется с исходным текстом для получения зашифрованного текста. Эта часть алгоритма называется генератором псевдослучайной последовательности (англ. Pseudo-Random Generation Algorithmor PRGA).
![](https://konspekta.net/stydopediaru/baza2/202872315860.files/image063.jpg)
![](https://konspekta.net/stydopediaru/baza2/202872315860.files/image065.jpg)
Рис 2.1- Генератор ключевого потока RC4
Реализация алгоритма RC4.
Описание основных функций и переменных.
#include<iostream>
#include<cstring>
using namespace std;
void crypt(char cipher[]);
int main()
{
cout<<"--------RC4---------"<<endl;
char choose1,choose2;
do{
int s[256],t[256];
char k[256];
char plaintext[1024],ciphertext[1024];
cout<<"Enter key:";
cin>>k; //считать ключ
for(int i=0;i<256;i++) //инициализация ключевого массива
{
s[i]=i;
t[i]=k[i%strlen(k)]; //strlen(k)- длинна строки k
}
int j=0;
for(int i=0;i<256;i++) //создание ключа
{
int temp;
j=(j+s[i]+t[i])%256;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
cout<<"\nEnter plaintext:"<<endl;
cin>>plaintext; //считать текст, который требуется зашифровать
int m,n,key[256],q;
m=n=0;
int i;
cout<<"\nciphertext:"<<endl;
for(i=0;i<strlen(plaintext);i++)//шифруем
{
int temp;
m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
ciphertext[i]=plaintext[i]^key[i];
cout<<ciphertext[i];
}
ciphertext[i]='\0';
cout<<endl;
cout<<"\ndecrypt (y/n)";
cin>>choose2;
while(choose2=='y'||choose2=='Y')
{
crypt(ciphertext);//вызываем функцию, для дешифрования
choose2='n';
}
cout<<endl;
cout<<"\nrepeat encryption?(y/n)";
cin>>choose1;
}while(choose1=='y'||choose1=='Y');
cout<<"\n______________________EXID_________________________"<<endl<<endl;
system("pause");
}
void crypt(char cipher[])
{
int s[256],t[256];
char k[256];
char plaintext[1024];
cout<<"\nEnter key:";
cin>>k;
for(int i=0;i<256;i++)
{
s[i]=i;
t[i]=k[i%strlen(k)];
}
int j=0;
for(int i=0;i<256;i++)
{
int temp;
j=(j+s[i]+t[i])%256;
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
int m,n,key[256],q;
m=n=0;
int i;
cout<<"\ndecriptet text"<<endl;
for(i=0;i<strlen(cipher);i++)
{
int temp;
m=(m+1)% 256;
n=(n+s[n])% 256;
temp=s[m];
s[m]=s[n];
s[n]=temp;
q=(s[m]+s[n])%256;
key[i]=s[q];
plaintext[i]=cipher[i]^key[i];
cout<<plaintext[i];
}
cout<<endl;
}
Результаты выполнения программы.
![](https://konspekta.net/stydopediaru/baza2/202872315860.files/image067.jpg)
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|