2015-05-12 3 views
1

Простого XOR дешифрование:найти длину ключа

Для того, чтобы разорвать это шифрование, мы должны сделать несколько предположений:

1) Ключ является достаточно коротким (в нашем случае, мы будем считать, что это меньше, чем 30 байт, но больше, чем 3 байта)

2) текст ясно ASCII

3) текст был написан как простой английский

4) Текст достаточно длиннее ключ (или Есть несколько отрывков текста шифруется с тем же ключом)

Описание Длина ключа:

Если текст английский, мы знаем, что наиболее распространенными символами являются e, t, a, o, n, r, i, s, h, d, (...). Более конкретно, если мы произвольно выбираем 2 символа из любого текста, мы знаем, что у нас больше 6% вероятности того, что они имеют одинаковое значение. Длина ключа меньше 30 байт.

Чтобы определить правильность заданной длины ключа, мы используем эти предположения и подразделяем зашифрованный текст на сегменты того же размера, что и длина ключа. Затем, XOR каждый раздел с разделом перед ним и подсчитайте количество равных значений. Математика показывает нам, что если Ti == Tj, то

Bi^Bj = (Ti^Kn)^(Tj^Kn) 
     = (Ti^Tj)^(Kn^Kn) 
     = (0)^(0) 
     = 0 

Тогда у меня должна быть длина ключа. Но как мне это получить? Единственное, что у меня есть, - это прочитать двоичный файл и открыть двоичный файл.

Код:

int main(int argc, char* argv[]){ 
    if (argc != 2) { 
     exit(EXIT_FAILURE); 
    } 
    FILE* fp = fopen(argv[1], "rb"); 

    printf("File Opened: %s\n", argv[1]);    
    fclose(fp); 
    return EXIT_SUCCESS; 
} 

Binary File:

http://i.stack.imgur.com/0DNTo.png

По некоторым причинам, я не могу отправить ссылку на файл или запись, в противном случае вы, ребята, не могли бы иметь представление.

+2

Вы начинаете свой вопрос с заявления, которое звучит так, как будто мы должны иметь представление о том, о чем вы говорите. Откуда взялись данные? Является ли это на самом деле проблемой программирования, или это будет лучше подходит для форумов по вопросам хиптографии, информационной безопасности или обратного проектирования? Единственный вопрос в вашей публикации: «Как я получу его?» ссылаясь на некоторый ключ для некоторого алгоритма, который вы не называете и для которого вы не предоставляете никаких данных. :) –

+0

@DavidHoelzer Он включает в себя базовое шифрование/дешифрование XOR, это дополнительное назначение кредита. – asdf3fasdf

+0

@ asdf3fasdf, звучит неплохо, но нам, вероятно, нужен больше контекста. Можете ли вы воспроизвести полное описание задания, которое вам было дано? –

ответ

0

Я предполагаю, что у вас есть некоторые данные, которые привязаны к некоторому ключу. Ключ имеет фиксированный размер и повторяется снова и снова до длины данных.

Пусть К ключ, длины к, и пусть Р массив с простым текстом и Е представляет собой массив с шифрованным текстом в нем, а затем

P[0: k-1] xor K = E[0: k-1] 
P[k:2l-1] xor K = E[k:2k-1] 

так E[0: k-1] xor E[k:2k-1] такой же, как P[0: k-1] xor P[k:2k-1], то есть, это xor двух простых текстовых строк. Вы можете вычислять частоты этих значений из того, как часто вы ожидаете появления определенных букв в обычном тексте, и делать догадки о подстановках на основе этих частот.

Постройте угадывание на значения обычного текста для P[0: k-1], затем xoring это предположение против E[0: k-1] даст угадать K. Пробуйте ключ и итерации, улучшая свою догадку. Поскольку это английский, как только у вас есть гласные, его довольно легко угадать.

Чтобы получить длину ключа, вам нужно просто попробовать все возможные длины ключа, k, разделить текст шифрования на диапазоны размеров k и xor пары из них. Посмотрите на количество позиций символов, которые согласны. Хорошая эвристика заключается в том, что наиболее вероятная длина ключа соответствует самому широкому соглашению между парами.

Для этого есть handy tool.