Как я улучшаю повреждающиеся шифры подстановки программно?

Я записал (пишу), программа, чтобы проанализировать зашифрованный текст и попытаться проанализировать и повредить его с помощью частотного анализа.

Зашифрованный текст принимает форму каждой буквы, заменяемой некоторую другую букву т.е. a-> m, b-> z, c-> t и т.д. и т.д., все пробелы и не альфа-символы удалены, и прописные буквы сделаны нижним регистром.

Пример был бы:

Orginal вводят - thisisasamplemessageitonlycontainslowercaseletters
Зашифрованный вывод - ziololqlqdhstdtllqutozgfsnegfzqoflsgvtkeqltstzztkl
Попытка взламывания - omieieaeanuhtnteeawtiorshylrsoaisehrctdlaethtootde

Здесь это только получило меня, A и Y правильно.

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

Я ищу методы и способы улучшить точность моей программы как в данный момент, я не разбираюсь в слишком многих символах. Например, при попытке взломать X количеств символов от Гордости и Предубеждения, я добираюсь:

1600 - 10 корректных букв
800 - 7 корректных букв
400 - 2 корректные буквы
200 - 3 корректные буквы
100 - 3 корректные буквы.

Я использую Romeo и Juliet как основа для получения данных частоты.

Было предложено мне посмотреть на и использовать частоту символьных пар, но я не уверен, как использовать это, потому что, если я не использую очень большие зашифрованные тексты, я могу вообразить аналогичный подход к тому, как я делаю, отдельные символы были бы еще более неточными и вызвали бы больше ошибок, чем успехи. Я надеюсь также сделать своего взломщика шифрования более точным для более коротких 'исходных данных'.

10
задан 5 revs, 4 users 62% 12 June 2018 в 11:36
поделиться

9 ответов

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

1) Отображения частот недостаточно для решения такой головоломки, многие частоты очень близки друг к другу, и если вы не используете один и тот же текст для источника частоты и открытого текста, вы почти гарантированно получите несколько букв вне зависимости от длины текста. У разных материалов будут разные схемы использования.

2) Не зачищайте пробелы, если можете. Это позволит вам проверить свое потенциальное решение, проверив, что некоторый процент слов существует в словаре, к которому у вас есть доступ.

3) Изучите обработку естественного языка, если вы действительно хотите вникнуть в языковую сторону этого. В этой книге есть все, что вы могли когда-либо знать о ней.

Изменить: Сначала я бы изучил биграфы и триграфы. Если вы достаточно уверены в одной или двух буквах, они могут помочь предсказать вероятных кандидатов на следующие буквы. По сути, это таблицы вероятностей, где AB - это вероятность того, что за буквой A последует буква B. Итак, если у вас есть решенная буква, ее можно использовать для решения букв рядом с ней, а не просто угадывать. Например, если у вас есть слово «y_u», для вас очевидно, что это слово - это вы, но не для компьютера.Если у вас остались буквы N, C и O, биграфы сообщат вам, что YN и YC очень редки, тогда как YO гораздо более вероятен, поэтому даже если ваш текст имеет необычную частоту букв (что легко, когда он короткий ) у вас все еще есть довольно точная система решения неизвестных. Вы можете поискать скомпилированный набор данных или провести свой собственный анализ, но убедитесь, что используете много разнообразного текста, много Шекспира - это не то же самое, что половина Шекспира и половина журнальных статей.

2
ответ дан 3 December 2019 в 22:36
поделиться

Прежде всего, Ромео и Джульетта , вероятно, не очень хорошая основа для использования. Во-вторых, да, орграфы полезны (как и триграфы). Для подстановочного шифра, на который вы смотрите, хорошим местом для начала были бы книги Уильяма Фридмана Военный криптоанализ .

2
ответ дан 3 December 2019 в 22:36
поделиться

Вы можете попробовать смотреть на пары, а не на отдельные буквы. Например, в английском языке за t часто следует h, как и за s. Здесь пригодится марковское моделирование.

1
ответ дан 3 December 2019 в 22:36
поделиться

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

Хотя верно, что в большинстве английских предложений буква «е» встречается чаще, это еще не все.

Часть, которая делает занятие увлекательным, представляет собой серию пробных гипотез / проверок гипотез / гипотез принятия или отклонения, которые превращают все это в итеративный процесс.

Многие предложения содержат слова «из» и «того». Глядя на ваше предложение и предполагая, что одно из двухбуквенных слов состоит из, подразумевает дальнейшие замены, которые могут позволить вам сделать выводы о других словах. Короче говоря, вам нужен словарь часто встречающихся слов, чтобы вы могли делать дальнейшие выводы.

Поскольку может потребоваться большое количество операций с возвратом, возможно, будет разумным рассмотреть реализацию пролога или erlang в качестве основы для разработки реализации на C ++.

Удачи вам. Пожалуйста, поделитесь своими результатами, когда закончите.

2
ответ дан 3 December 2019 в 22:36
поделиться

Сами по себе алгоритмы шифрования, встроенные в Python, отсутствуют. Однако может потребоваться просмотреть Python Cryptography Toolkit (PyCrypt). Я только обдумал его, но он упоминается в документации Python по криптографическим службам . Вот пример того, как можно зашифровать последовательность с помощью AES с помощью PyCrypt:

from Crypto.Cipher import AES
from urllib import quote

# Note that for AES the key length must be either 16, 24, or 32 bytes
encryption_obj = AES.new('abcdefghijklmnop')
plain = "Testing"

# The plaintext must be a multiple of 16 bytes (for AES), so here we pad it
# with spaces if necessary.
mismatch = len(plain) % 16
if mismatch != 0:
  padding = (16 - mismatch) * ' '
  plain += padding

ciph = encryption_obj.encrypt(plain)

# Finally, to make the encrypted string safe to use in a URL we quote it
quoted_ciph = quote(ciph)

Затем вы сделаете эту часть вашего URL, возможно, как часть запроса GET.

Чтобы расшифровать, просто отмените процесс; предполагая, что encryption _ obj создан, как описано выше, и что вы получили соответствующую часть URL-адреса, это будет сделано:

from urllib import unquote

# We've already created encryption_object as shown above

ciph = unquote(quoted_ciph)
plain = encryption_obj.decrypt(ciph)

Вы также можете рассмотреть другой подход: один простой метод будет хэшировать первичный ключ (с помощью соли, если вы хотите) и хранить хэш и pk в вашей базе данных. Предоставьте пользователю хэш как часть его ссылки, а когда они вернутся и представят хэш, найдите соответствующий pk и верните соответствующий объект. (Если вы хотите пройти по этому маршруту, проверьте встроенную библиотеку hashlib .)

В качестве примера, у вас было бы что-то подобное, определенное в models.py:

class Pk_lookup(models.Model):
  # since we're using sha256, set the max_length of this field to 32
  hashed_pk = models.CharField(primary_key=True, max_length=32)
  key = models.IntegerField()

И вы бы создали хэш в представлении, используя что-то вроде следующего:

import hashlib
import Pk_lookup

hash = hashlib.sha256()
hash.update(str(pk)) # pk has been defined previously
pk_digest = hash.digest()

lookup = Pk_lookup(hashed_pk=pk_digest,key=pk)
lookup.save()

Обратите внимание, что вы также должны цитировать эту версию; если вы предпочитаете, вы можете использовать hexdigest () вместо digest (вам не придется цитировать результирующий ряд), но вам придется скорректировать длину поля, чтобы 64.

-121--4859403-

Сначала установите JAI . Затем установите JAI/ImageIO . Затем сделать

public static void main(final String[] args) throws Exception
{
    final BufferedImage tif = ImageIO.read(new File("test.tif"));
    ImageIO.write(tif, "png", new File("test.png"));
}
-121--4154811-
  • Слово одной буквы является большим намеком (как правило, только «A» и «I», редко «O». Случайный язык допускает «K»). Существует также конечный набор из двух и трёх буквенных слов. Нет помощи, если места были удалены.

  • Пары гораздо диагностичнее, чем вы думаете. Например: некоторые буквы никогда не появляются удвоенными в английском языке (хотя это не является абсолютным, если места были удалены или если разрешен иностранный словарь), а другие являются общими двойными; также очень часты некоторые разнородные пары.

По общему правилу, ни один анализ не даст определенности. Необходимо назначить каждой шифровальной букве набор возможных переводов с соответствующими вероятностями. И объединять несколько тестов, пока вероятности не станут очень значимыми.

Вы можете определить время закрытия, проверив Энтропию Шеннона .

2
ответ дан 3 December 2019 в 22:36
поделиться

Мне очень важно рассматривать пары символов.

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

Например, невозможно получить qq, используя допустимые английские слова, так как после каждого q должен следовать u. Если в зашифрованном тексте повторяются одни и те же буквы, можно автоматически исключить возможность того, что они представляют q.

Тот факт, что вы удаляете пробелы из ввода, несколько ограничивает полезность, поскольку комбинации, которые никогда не существовали бы в одном слове, например ht теперь может произойти, если h заканчивает одно слово, а t начинает другое. Тем не менее, я подозреваю, что эти дополнительные точки данных позволят вам обрабатывать гораздо более короткие строки текста.

Кроме того, я бы предположил, что «Ромео и Джульетта» - только хорошая основа для статистических данных, если вы собираетесь анализировать сочинения того периода. Произошли некоторые существенные изменения в орфографии и использовании слов, которые могут исказить статистику.

2
ответ дан 3 December 2019 в 22:36
поделиться

Не полный ответ, но, возможно, полезный указатель: вы можете использовать словарь, чтобы определить, насколько хорош ваш кандидат в виде открытого текста. В системе UNIX с установленным aspell вы можете извлечь список английских слов с помощью команды

aspell -l en dump master
2
ответ дан 3 December 2019 в 22:36
поделиться

Частотный анализ

Частотный анализ - отличное место для начала. Однако «Ромео и Джульетта» - не очень хороший выбор, чтобы брать частоту символов для расшифровки текста «Гордость и предубеждение». Я бы посоветовал использовать частоты из на этой странице , потому что там используются 7 разных текстов, которые по возрасту ближе к Гордости и Предубеждениям. В нем также перечислены вероятности орграфов и триграфов. Однако орграфы и триграфы могут оказаться не столь полезными, когда из текста удалены пробелы, потому что это вносит шум орграфов и триграфов, создаваемых смешанными словами.

Другой ресурс по частоте символов - этот сайт . Он утверждает, что использует «хорошее сочетание разных литературных жанров»

. Как вы видели, частотный анализ обычно становится более вероятностно правильным с увеличением длины зашифрованного текста. Частотный анализ также только помогает подсказать правильное направление, в котором нужно двигаться. Например, зашифрованный символ с самой высокой частотой может быть e, но также вполне может быть a, который также имеет высокую частоту. Один из распространенных методов - начать с некоторых из наиболее часто встречающихся букв в данном языке, попытаться сопоставить эти буквы с разными буквами, часто встречающимися в тексте, и посмотреть, образуют ли они общие слова, например, и так далее. Тогда вы идете оттуда.

Хорошая вводная книга

Если вы ищете хорошее введение в криптографию для непрофессионала, вы можете попробовать Кодовую книгу Саймона Сингха. Очень читабельно и интересно.В книгах рассматривается развитие кодов и расшифровка кодов на протяжении всей истории. Он довольно рано рассматривает подстановочные шифры и описывает некоторые общие методы их взлома. Кроме того, в книге (которая уже завершена) у него был вызов шифра, который состоял из нескольких различных кодов, которые нужно было взломать, включая некоторые шифры подстановки. Вы можете попробовать прочитать, как шведская группа взломала эти шифры, на этом сайте . Тем не менее, я мог бы предложить прочитать хотя бы часть книги, посвященную шифрованию подстановки, прежде чем читать эти решения.

Между прочим, я никоим образом не участвую в публикации этой книги. Мне просто очень понравилось.

1
ответ дан 3 December 2019 в 22:36
поделиться

Что касается орграфов, биграмм и аппроксимации слов, Джон Пирс (соавтор транзистора и ИКМ) написал отличную книгу Введение в теорию информации , которая содержит расширенный анализ вычисления их характеристик, почему вам нужно к и как их найти. Я нашел это полезным при написании кода дешифрования частотного анализа самостоятельно.

Кроме того, вы, вероятно, захотите написать эргодический источник для питания вашей системы, а не полагаться на один источник (например, роман).

1
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: