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

Discussion in 'WASM.CRYPTO' started by xSplashx, Aug 3, 2009.

  1. xSplashx

    xSplashx New Member

    Blog Posts:
    0
    Joined:
    Mar 23, 2009
    Messages:
    22
    Всем доброго времени суток.Я студент,перешёл на 2-ой курс.Сейчас летом решил продложить обучение програмированию и взялся за криптографию,которая будет в дальнейшем.Начать решил с простого xor шифрования.Шифрую строку текста с ключём словом.Ниже привожу реализацию на С++,т.к. в следующем семестре именно этот язык будет,пишу всё на нём).
    Code (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

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    если не понял, то задача сводится к: перебором найти длину ключа, который короче или равен длине шифртекста.
     
  4. OLS

    OLS New Member

    Blog Posts:
    0
    Joined:
    Jan 8, 2005
    Messages:
    322
    Location:
    Russia
    Он же написал, что с первой частью разобрался, он про собственно угадывание исходных текстов спрашивает когда ключа уже нет :
    pA1 xor pB1,
    pA2 xor pB2,
    pA3 xor pB3,
    ...
     
  5. xSplashx

    xSplashx New Member

    Blog Posts:
    0
    Joined:
    Mar 23, 2009
    Messages:
    22
    Первый пункт я понял так:Ксорим текст самим с собой но начиная не с первого элемента на пример:
    Code (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% запоминаем их. Затем считаем минимальную разницу этими числами это и длинна ключа будет как я понял.
    А вот во втором пункте не понимаю что с чем ксорить хоть убей)