Итак, те кто хочет почитать про крипто алгоритмы в принципе, могут залезть на вики, попинасть Романенкова Сашу, и сделать прочие нехорошие вещи. А конкретно в этом посте я на пальцах объясню как работает алгоритм шифрования RC4, так как я его понимаю.
Здесь я хотел написать длинную статью на тему как работет RC4, но внезапно натолкнулся на статью на хабре которая итак неплохо это делает, поэтому я просто напишу исходник на С =)
Статья тут: http://habrahabr.ru/blogs/crypto/111510/#habracut
Мы будем повсместно использовать макрос SWAP так что для начала обьявим его
http://en.wikipedia.org/wiki/XOR_swap_algorithm
А так же несколько глобальных переменных:
Начальная инициалзиция вектора-перестановки ключем.
Используется алгоритм ключевого расписания (Key-Scheduling Algorithm)
Здесь я хотел написать длинную статью на тему как работет RC4, но внезапно натолкнулся на статью на хабре которая итак неплохо это делает, поэтому я просто напишу исходник на С =)
Статья тут: http://habrahabr.ru/blogs/crypto/111510/#habracut
Мы будем повсместно использовать макрос SWAP так что для начала обьявим его
#define SWAP(A,B) A=A^B; B=A^B; A=A^B;Этот макросс всего лишь перестановка 2ух элементов.
http://en.wikipedia.org/wiki/XOR_swap_algorithm
А так же несколько глобальных переменных:
int i,j; unsigned char S[255];
Начальная инициалзиция вектора-перестановки ключем.
Используется алгоритм ключевого расписания (Key-Scheduling Algorithm)
void RC4_Init(unsigned char* key) { int keylen = strlen(key); for (i = 0; i < 256; i++) S[i] = i; for (j = i = 0; i < 256; i++) { j = (j + key[i % keylen] + S[i]) % 256 SWAP(S[i],S[j]); } }Эта функция должна вызыватся перед шифровокой\расшифровкой. Дальше нужно реализовать генератор псевдослучайной последовательности. При каждом вызове функция будет выплевывать последующий байт ключа, которым мы XOR-ом будем объеденять с байтом исходных данных
char RC4_NextKeyByte() { i = (i + 1) % 256; j = (j + S[i]) % 256; SWAP(S[i],S[j]); return S[(S[i] + S[j]) % 256]; }И наконец самое простое. Для каждого байта входных данных запрашиваем байт ключа и объеденяем их с помощью XOR. Учитывая что алгоритм симетричный то эту же функцию мы будем использовать для дешифровки.
char RC4_Crypt(char in) { return in ^ RC4_NextKeyByte(); }Вот вся программа:
#include <stdio.h> #include <string.h> #define SWAP(X,Y) X = X^Y; Y = X^Y; X = X^Y int i,j; unsigned char S[256]; void RC4_Init(unsigned char* key) { int keylen = (int)strlen((char*)key); for (i = 0; i < 256; i++)S[i] = i; for (j = i = 0; i < 256; i++) { j = (j + key[i % keylen] + S[i]) % 256; SWAP(S[i],S[j]); } } char RC4_NextKeyByte() { i = (i + 1) % 256; j = (j + S[i]) % 256; SWAP(S[i],S[j]); return S[(S[i] + S[j]) % 256]; } char RC4_Crypt(char in) { return in ^ RC4_NextKeyByte(); } int main(int argc, char* argv[]) { int x; unsigned char key[] = "Key"; char data[] = "Test data!"; printf("%s\n",data); RC4_Init(key); for (x = 0; x < strlen(data); x++) { data[x] = RC4_Crypt(data[x]); } printf("%s\n",data); RC4_Init(key); for (x = 0; x < strlen(data); x++) { data[x] = RC4_Crypt(data[x]); } printf("%s\n",data); }
Огромное спасибо!
ОтветитьУдалитьОчень помог!
На 3 курсе этот код приниматься не будет.
ОтветитьУдалитьЛолд, Саш, а если я буду сдавать? =)
ОтветитьУдалитьЭто другой разгвор.. Я покажу тебе почему я не буду принимть этот код. =)
ОтветитьУдалитьХм, а у нас откровенное воровство не воспрещается?)))
ОтветитьУдалитьДля нас и делалось, какое воровство)
ОтветитьУдалитьА как же творческое переосмысление???? =)
ОтветитьУдалить