Симметричный биективный строковый алгоритм? - PullRequest
2 голосов
/ 21 июля 2009

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

Например: Давайте рассмотрим, что у меня есть алфавит «A», «B», «C», «D», «E», «F». Я хочу что-то вроде F ("ABC") = "CEA" и F ("CEA") = "ABC" для каждой перестановки букв N.

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

Заранее спасибо.

Редактировать 1: Я должен уточнить, что я хочу достаточно энтропии, чтобы F ("ABC") равнялся "CEA" и F ("CEA") = "ABC", но тогда я НЕ хочу, чтобы F ("ABD") равнялся "CEF". Обратите внимание, что две входные буквы остались одинаковыми, а две соответствующие выходные буквы остались прежними?

Так что Цезарь Шифр ​​/ ROT13 или тасование массива будет недостаточно. Однако мне не нужна «настоящая» безопасность. Достаточно энтропии, чтобы вывод функции казался случайным. Слабые алгоритмы шифрования приветствуются.

Ответы [ 6 ]

2 голосов
/ 23 июля 2009

Предлагаю следующее.

Выполните плотное кодирование ввода для положительных целых чисел - с размером алфавита n и длиной строки m вы можете закодировать строку в целые числа от нуля до n^m - 1. В вашем примере это будет диапазон [0,215]. Теперь выполните фиксированную инволюцию для закодированного числа и снова декодируйте его.

2 голосов
/ 22 июля 2009

Если простого переноса или подстановки недостаточно, звучит так, будто вы хотите перейти к полиалфавитному шифру . Шифр Vigenère чрезвычайно легко внедрить в код, но все еще трудно взломать без использования компьютера.

2 голосов
/ 21 июля 2009

Просто создайте массив объектов, который содержит 2 поля - букву и случайное число. Сортировать массив. По случайным числам. Это создает отображение, где i-я буква алфавита теперь отображается на i-ю букву в массиве.

1 голос
/ 21 июля 2009

Возьми RC4, согласись с паролем, и все готово. (Не то чтобы это было бы очень безопасно.)

0 голосов
/ 24 июля 2009

Я бы изложил вашу проблему таким образом и дал бы вам стратегию для этого пересчета:
«Подстановочный шифр, в котором изменение входа приводит к большему изменению выхода».
Блокировка символов не имеет значения - в конце концов, это просто сопоставления между числами. Здесь я расскажу о буквах, но вы можете расширить их на любой блок из n символов.

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

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

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

0 голосов
/ 22 июля 2009

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

Нет, подумал, я забыл про повторения персонажей. Возможно, разделите входные данные на части без повторения символов и примените мое предложение ко всем этим частям.

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