Генерация псевдо-натуральной фразы из большого целого числа обратимым образом - PullRequest
5 голосов
/ 13 января 2011

У меня большое и уникальное целое число (на самом деле хеш SHA1).

Примечание: Пока я говорю о хэше SHA1, это , а не криптография / секретный вопрос! Я не пытаюсь сломать SHA1. Представьте случайное 160-разрядное целое число вместо SHA1, если это поможет.

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

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

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

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

Возможное использование сгенерированной фразы: удобочитаемая версия идентификатора коммита Git для использования в качестве девиза для данной версии программы, созданной на основе этого коммита. (Как я уже сказал, это «для удовольствия». Я не утверждаю, что это очень практично или гораздо более читабельно, чем сам SHA1.)

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

Теперь я думаю о попытке решить проблему еще раз. Любой совет, как подойти к этому? Как вы думаете, цепной подход Маркова может работать здесь? Что-то еще?

Ответы [ 4 ]

3 голосов
/ 13 января 2011

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

noun[bits_01-10] verb[bits11-20] adjective[bits21-30] verb[bits31-40],
noun[bits_41-50] verb[bits51-60] adjective[bits61-70] verb[bits71-80],
noun[bits_81-90] verb[bits91-100] adjective[bits101-110] verb[bits111-120] and 
noun[bits_121-130] verb[bits131-140] adjective[bits141-150] verb[bits151-160].

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

1 голос
/ 31 декабря 2017

Это старый вопрос, но entropoetry - это библиотека JavaScript (Node / frontend), которая также решает эту проблему. Он сочетает в себе марковскую поэзию и кодирование Хаффмана, поэтому, учитывая один и тот же словарь (т.е. ту же версию библиотеки), преобразование чисел поэзии будет двунаправленным.

Пример из командной строки узла:

> var Poet = require('entropoetry'); var p = new Poet();
> p.stringify(Buffer.from('deadbeef', 'hex'))
'old trick of loving you\nif you but'
> console.log(p.parse(`old trick of loving you
... if you but`))
<Buffer de ad be ef>

И поскольку технология выходит на , то, что казалось идеей «только для развлечения» в 2011 году, получило реальное применение в 2017 году: запоминание закрытых ключей криптовалюты (мозговой кошелек), ссылок Dat / IPFS и т. Д.

1 голос
/ 13 января 2011

Давайте, посмотрим ... Английский язык содержит около 1 000 000 слов .Это около 20 бит на слово.SHA1 составляет 160 бит, поэтому вам нужно 8 слов.Теоретически, все, что вам нужно сделать, это взять n-е слово из словаря оксфордского английского языка, где n - это группа из 20 битов за раз.

Теперь, чтобы сделать его более естественным, выможно попытаться добавить «in / at / on / and / the ...» между словами в соответствии с их типом (существительные, глаголы ...), используя простой алгоритм.(Конечно, вы должны удалить все эти слова из вашего основного словаря).

Алгоритм обратим: просто удалите все слова, которые вы добавили, и преобразуйте каждое слово в его 20-битный индекс.

Также попробуйте гугл "Генератор оскорблений".Некоторые из этих генераторов довольно хороши.Я не уверен насчет количества комбинаций.

Вы можете купить Оксфордский словарь английского языка на CD-ROM с более чем 500 000 слов (19-бит).Однако я не уверен, будет ли легко извлечь слова и их типы.Я не уверен, что это законно, но я думаю, что вы не можете претендовать на патент на словарные статьи ...

0 голосов
/ 13 января 2011

Хэш-функция означает, что невозможно (в разумных пределах) получить данные из хэша, если они не повреждены (небезопасны).

Вопрос должен касаться взлома SHA-1 алгоритм хеширования - посмотрите на Google, он не такой сломанный .Так что нет, вы не можете создать английскую фразу из хеш-кода SHA-1, если вы можете, пожалуйста, сделайте огромную статью об этом, многие из них бесполезны, это будет прорыв: -)

Править: если достаточно только части хеша, я предлагаю просто грубую силу (+ простая карта фразы хеша <->, возможно, в файле или в базе данных), алгоритм хеширования является очень «сильным супом» (трудная проблема).

Edit2: ребята, будьте более конкретны, когда задаете вопрос, а не моя вина ... Я не буду удалять это, так что это отпугнет других криптографов: -)

...