Всем доброго времени суток.Я студент,перешёл на 2-ой курс.Сейчас летом решил продложить обучение програмированию и взялся за криптографию,которая будет в дальнейшем.Начать решил с простого xor шифрования.Шифрую строку текста с ключём словом.Ниже привожу реализацию на С++,т.к. в следующем семестре именно этот язык будет,пишу всё на нём). Код (Text): #include <iostream> #include<string.h> int main(int argc,char* argv[]) {char *key=argv[1];using namespace std; char *buff=(char*)malloc(sizeof(char)*20); cin.get(buff,100,'\n'); for(int i=0;i<strlen(buff);i++){ for(int j=0;j<strlen(key);j++) buff[i]^=key[j];} cout<<buff; FILE*file; char*file_name="crypt.txt"; file = fopen( file_name, "w" ); fputs( buff, file ); fclose( file ); } Меня интрересует каким образом имея только зашифрованое xor'ом сообще можно востановить его исходный вид?. Для этой цели я прочитал в книге Брюса Шнайера главу "Простое xor".Но всё равно расшифровать не получилось. Он предлагает такой порядок действий: 1.Определим длину ключа с помощью процедуры,изветной как подсчёт совпадений.Применим операцию xor к шифротексту,используя в качестве ключа сам шифротекст с различными смешениями,и подсчитаем совпадающие байты.Если величина смещения кратна длинне ключа,то совпадет свыше 6 процентов байтов.Если нет, то будут совпадать меньше чем 0.4 процента(считая,что обычный ASCII текст кодируется случайным ключем,для других типов открытых текстов числа будут другими). Это называется показателем совпадений. Минимальное смещение от одного значения кратного длине ключа, к другому и есть длина ключа. 2.Сместим шифротекст на эту длину и проведем операцию XOR для смещенного и оригинального шифротекстов.Результатом операции будет удаения ключа и получение открытого текста, подвергнутого операции XOR с самим собой,сещенным на длину ключа.Так как в английском языке на один байт приходится 1.3бита действительной информации(см раздел 11.1),существующая значительная избыточность позволяет определить способ шифрования. Первый пункт вроде бы понял,а второй нет,перексорил массу вариантов всё равно не получилось.Подсткажите что нужно делать во 2-ом пункте,а если есть другие варианты дешифрования с радостью прочитаю.Заранее спасибо.
a xor b = c xor b = a . . . = c xor a = b т.к. b.Length<=a.Length, то a[i+n*j] xor b, но a xor b xor a[i+j] xor b=a xor a[i+j] т.о от ключа можно избавиться зная его длину 3 xor 5 = 6 xor 5 = 3 . . . = 6 xor 3 = 5 3 4 5 6 7 8 9 xor 1 2 3 = 2 6 6 7 5 B 8, но 2 6 6 7 xor 7 5 B 8 = 5 (= 3 xor 6) 3 (= 4 xor 7) D (= 5 xor 8) F (6 xor 9) дальше сам. осталось найти по пересекающемуся началу и концу общий знаминатель и все пойдет.
если не понял, то задача сводится к: перебором найти длину ключа, который короче или равен длине шифртекста.
Он же написал, что с первой частью разобрался, он про собственно угадывание исходных текстов спрашивает когда ключа уже нет : pA1 xor pB1, pA2 xor pB2, pA3 xor pB3, ...
Первый пункт я понял так:Ксорим текст самим с собой но начиная не с первого элемента на пример: Код (Text): strcpy(buf1,buf); int len=strlen(bufpt); for(int i=0;i<len;i++) {for(int j=7;j<len;j++) buf[i]^=buf1[j];} меняем начальное значение j от 1 до длины сообщения и считаем количество совпавших символов с исходным шифрованным сообщением при каких j совпадений больше 6% запоминаем их. Затем считаем минимальную разницу этими числами это и длинна ключа будет как я понял. А вот во втором пункте не понимаю что с чем ксорить хоть убей)