New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simple brute-force implementation #94

Merged
merged 1 commit into from Oct 10, 2018

Conversation

5 participants
@vasyan
Contributor

vasyan commented Oct 10, 2018

I've created a simple console-output-based brute-force script. It looks like a crypto mining now.
image

@vasyan vasyan force-pushed the vasyan:master branch from 57879d8 to 77b4aef Oct 10, 2018

@ai ai merged commit ec43400 into ai:master Oct 10, 2018

1 check passed

continuous-integration/travis-ci/pr The Travis CI build passed
Details
@ai

This comment has been minimized.

Owner

ai commented Oct 10, 2018

Я очень сильно прокачал перебор (многопоточность, отсутствие вызовов sh), но в итоге за час он смог продвинутся только на 1.071820381004764e-80 % работы.

Жалко, направление оказалось тупиковым.

@y8

This comment has been minimized.

y8 commented Oct 10, 2018

Перебор такого алфавита изначально является запредельно ресурсоёмкой задачей. Если я правильно помню комбинаторику, то это факториал длинны ряда. А для 64 символьного алфавита это ~1.2*10^89. Это очень много перебора.

Задачу проще решить аналитически.

gzip это два алгоритма:

  • Lempel Ziv (lz77)
  • Huffman Coding

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

Huffman coding строит дерево частоты вхождения символов и дальше кодирует самые популярные меньшим числом бит. Очевидно что перестановка не будет иметь никакого эффекта на Huffman coding.

Значит необходимо оптимизировать для LZ77. В первую очередь необходимо поставить алфавит или в самый конец файла или в самое начало, это даст больше возможностей для обратных ссылок.

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

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

Ну и переписать исходники так, чтоб было максимально много повторяющихся блоков текста :)

Вот онлайн демка lz77:
http://www.geocities.ws/diogok_br/lz77/demo.htm

@ai

This comment has been minimized.

Owner

ai commented Oct 10, 2018

Есть ещё варианты — генетический алгоритм 😄

@ai

This comment has been minimized.

Owner

ai commented Oct 12, 2018

Я написал новый брутфорсер, который быстрее 21b99f7

@subzey

This comment has been minimized.

Contributor

subzey commented Oct 13, 2018

FYI: в гзипе бэкреференс не может быть короче 3 байт (нет даже способа закодировать длину 2)
В строке abcxabc будет использоваться бэкреф, а в abxab — нет.

Возможно, есть смысл извлечь из окружения триграммы (только "полезные":

hello world -> hel ell llo wor orl rld

и уже плясать от них: склеивать и комбинировать в разном порядке

@ai

This comment has been minimized.

Owner

ai commented Oct 13, 2018

@subzey ага, по твоему совету сильно ускорил перебор 49bb25a

@everdimension

This comment has been minimized.

everdimension commented Oct 24, 2018

Изначальная задача напомнила мне вот эту статью-визуализацию факториала пятидесяти двух https://czep.net/weblog/52cards.html

Интересное чтиво, рекомендую :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment