Простое xor шифрование

Тема в разделе "WASM.CRYPTO", создана пользователем xSplashx, 3 авг 2009.

  1. xSplashx

    xSplashx New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2009
    Сообщения:
    22
    Всем доброго времени суток.Я студент,перешёл на 2-ой курс.Сейчас летом решил продложить обучение програмированию и взялся за криптографию,которая будет в дальнейшем.Начать решил с простого xor шифрования.Шифрую строку текста с ключём словом.Ниже привожу реализацию на С++,т.к. в следующем семестре именно этот язык будет,пишу всё на нём).
    Код (Text):
    1. #include <iostream>
    2. #include<string.h>
    3. int main(int argc,char* argv[])
    4. {char *key=argv[1];using namespace std;
    5. char *buff=(char*)malloc(sizeof(char)*20);
    6. cin.get(buff,100,'\n');
    7. for(int i=0;i<strlen(buff);i++){
    8.     for(int j=0;j<strlen(key);j++)
    9.         buff[i]^=key[j];}
    10. cout<<buff;
    11. FILE*file;
    12. char*file_name="crypt.txt";
    13. file = fopen( file_name, "w" );
    14. fputs( buff, file );
    15. fclose( file );
    16. }
    Меня интрересует каким образом имея только зашифрованое xor'ом сообще можно востановить его исходный вид?. Для этой цели я прочитал в книге Брюса Шнайера главу "Простое xor".Но всё равно расшифровать не получилось. Он предлагает такой порядок действий:
    1.Определим длину ключа с помощью процедуры,изветной как подсчёт совпадений.Применим операцию xor к шифротексту,используя в качестве ключа сам шифротекст с различными смешениями,и подсчитаем совпадающие байты.Если величина смещения кратна длинне ключа,то совпадет свыше 6 процентов байтов.Если нет, то будут совпадать меньше чем 0.4 процента(считая,что обычный ASCII текст кодируется случайным ключем,для других типов открытых текстов числа будут другими). Это называется показателем совпадений. Минимальное смещение от одного значения кратного длине ключа, к другому и есть длина ключа.
    2.Сместим шифротекст на эту длину и проведем операцию XOR для смещенного и оригинального шифротекстов.Результатом операции будет удаения ключа и получение открытого текста, подвергнутого операции XOR с самим собой,сещенным на длину ключа.Так как в английском языке на один байт приходится 1.3бита действительной информации(см раздел 11.1),существующая значительная избыточность позволяет определить способ шифрования.
    Первый пункт вроде бы понял,а второй нет,перексорил массу вариантов всё равно не получилось.Подсткажите что нужно делать во 2-ом пункте,а если есть другие варианты дешифрования с радостью прочитаю.Заранее спасибо.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    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)
    дальше сам. осталось найти по пересекающемуся началу и концу общий знаминатель и все пойдет.
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    если не понял, то задача сводится к: перебором найти длину ключа, который короче или равен длине шифртекста.
     
  4. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Он же написал, что с первой частью разобрался, он про собственно угадывание исходных текстов спрашивает когда ключа уже нет :
    pA1 xor pB1,
    pA2 xor pB2,
    pA3 xor pB3,
    ...
     
  5. xSplashx

    xSplashx New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2009
    Сообщения:
    22
    Первый пункт я понял так:Ксорим текст самим с собой но начиная не с первого элемента на пример:
    Код (Text):
    1. strcpy(buf1,buf);
    2. int len=strlen(bufpt);
    3. for(int i=0;i<len;i++)
    4. {for(int j=7;j<len;j++)
    5. buf[i]^=buf1[j];}
    меняем начальное значение j от 1 до длины сообщения и считаем количество совпавших символов с исходным шифрованным сообщением при каких j совпадений больше 6% запоминаем их. Затем считаем минимальную разницу этими числами это и длинна ключа будет как я понял.
    А вот во втором пункте не понимаю что с чем ксорить хоть убей)