Шифровать текст, используя номер - PullRequest
5 голосов
/ 28 мая 2010

Проект Эйлера

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

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

Моя проблема с шифрованием

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

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

Вам известен такой алгоритм? Мне бы хотелось, чтобы пакет Python, который я мог прикрепить к коду, поверх внешней программы, которая могла бы иметь проблемы с переносимостью.

Спасибо

Адам

Ответы [ 7 ]

4 голосов
/ 28 мая 2010

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

PBKDF2 - это стандартизированный алгоритм для получения ключа на основе пароля, определенный в PKCS # 5. По сути, вы можете настроить параметр «итерации» так, чтобы получение ключа из пароля (ответ на проблему Эйлера) заняло бы несколько секунд. Затем ключ можно использовать для любого общего алгоритма симметричного шифрования, например, AES-128.

Это имеет то преимущество, что большинство криптографических библиотек уже поддерживают PBKDF2. Фактически, вы можете найти почтовые клиенты, которые поддерживают шифрование на основе пароля для сообщений S / MIME. Тогда вы можете просто опубликовать S / MIME, и люди смогут читать его с помощью почтового клиента. К сожалению, мой почтовый клиент (Thunderbird) поддерживает только шифрование с открытым ключом.

2 голосов
/ 28 мая 2010

Я думаю, что Инь Чжу привязал социальный аспект к этому, а Вихрь технический. Используя ваш предпочтительный подход:

python decrypt.py --problem=123 --key=1234567

номер ключа легко доступен для Google, и даже без этого быстрое нажатие на миллион ключей (при условии, что средняя длина ключа 5 десятичных цифр дает менее 20 бит ключа) довольно быстро. Если бы я хотел быть более умным, я мог бы использовать простые текстовые предположения (например, import, for) и значительно сократить свое пространство поиска.

При всех трудностях вам, вероятно, лучше всего использовать что-то действительно сложное, например:

>>> print codecs.getencoder('rot_13')('import codecs')[0]
vzcbeg pbqrpf 

И если вам нужно решение проблемы Project Euler 123, вам придется выбить его из меня ...

1 голос
/ 28 мая 2010

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

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

В этом вопросе , похоже, есть несколько примеров библиотек для использования с python.

0 голосов
/ 28 мая 2010

Если вам нужна подпрограмма шифрования, которая проста в использовании и распространении, я рекомендую p3.py Пола Рубина. Вероятно, это связано с быстротой, насколько она безопасна, но поскольку вам кажется, что вам нужно преодолеть препятствие, а не стену, защищающую от осады, это может быть хорошим выбором для ваших целей.

Вы также можете заглянуть в rijndael.py , который является реализацией AES и медленнее, чем p3.py.

0 голосов
/ 28 мая 2010

Самый простой подход - это хэшировать ответ, используя безопасную хеш-функцию, такую ​​как SHA-1, а затем предоставлять хеш, чтобы пользователи могли проверить свой ответ. Если вы хотите сделать грубое форсирование более сложным, итерируйте хеш - например, предоставьте результат n рекурсивных применений SHA1, где n - некоторый параметр, который вы выбираете, чтобы затруднить грубое форсирование.

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

Редактировать: Извините, я неправильно понял ваш оригинальный вопрос. Если вы хотите зашифровать свой ответ, вы можете сделать это, используя полученный выше хеш в качестве ключа шифрования для своего ответа, а не отправлять хеш.

0 голосов
/ 28 мая 2010

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

Кстати, есть много мест, где можно получить ответы на Project Euler, например, ответы на Haskell , Clojure ответы , F # ответы . Если кто-то хочет получить ответ только на вопрос, он может просто запустить программу. При условии, что Python настолько популярен, Google "Python Euler xx" даст вам множество блогов, решающих конкретную проблему.

0 голосов
/ 28 мая 2010

Просто используйте тройной DES и используйте разные ключи для каждой итерации, используйте число для генерации каждого из 3 ключей. Дополните длину ключа текстом, и все хорошо.

Tripple DES был разработан для повышения эффективности против грубой силы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...