Есть ли простой алгоритм шифрования целых чисел? То есть функция E (i, k), которая принимает n-битное целое число и ключ (любого типа) и производит другое несвязанное n-битное целое число, которое при подаче во вторую функцию D (E (i), k) (вместе с ключом) производит исходное целое число?
Очевидно, что есть несколько простых обратимых операций, которые вы можете выполнить, но все они, похоже, дают четко связанные выходные данные (например, последовательные входы приводят к последовательным выходам). Кроме того, конечно, существуют криптостойкие стандартные алгоритмы, но они не дают достаточно малых выходных данных (например, 32-битных). Я знаю, что любую 32-битную криптографию можно использовать методом перебора, но я не ищу чего-то криптографически стойкого, а просто того, что выглядит случайным. Теоретически это должно быть возможно; в конце концов, я мог бы просто создать словарь, случайным образом соединив каждое целое число. Но я надеялся на что-то менее требовательное к памяти.
Изменить: спасибо за ответы. Простые решения XOR не будут работать, потому что аналогичные входные данные будут давать аналогичные выходы.
9 ответов
Разве это не соответствует блочному шифру с размером блока = 32 биты?
Не очень популярен, потому что его легко сломать. Но теоретически возможно. Вот одна реализация на Perl: http://metacpan.org/pod/Crypt::Skip32
ОБНОВЛЕНИЕ. См. Также Формат с сохранением шифрования
ОБНОВЛЕНИЕ 2: RC5 поддерживает размер блока 32-64-128 бит.
Я написал статью некоторое время назад о том, как сгенерировать «криптографически безопасную перестановку» из блочного шифра, которая звучит так, как вы хотите. Он охватывает использование сворачивания для уменьшения размера блочного шифра и трюк для работы с диапазонами, не равными степени двойки.
Простой:
rand = new Random(k);
return (i xor rand.Next())
(точка xor-ing с rand.Next()
, а не k
заключается в том, что в противном случае, учитывая i
и E(i,k)
, вы можете получить k
с помощью k = i xor E(i,k)
)
Айден - это алгоритм, который я разработал. Он компактен, быстр и выглядит очень надежно. В настоящее время он доступен для 32- и 64-битных целых чисел. Он находится в общественном достоянии, и вы можете получить его из http://github.com/msotoodeh/integer-encoder.
Вы можете взять n-битный хэш своего ключа (при условии, что он является закрытым) и XOR, этот хеш с исходным целым числом для шифрования и с зашифрованным целым числом для дешифрования.
Вероятно, не криптографически надежный, но в зависимости от ваших требований может быть достаточно.
Если вы просто хотите выглядеть случайным и не заботитесь о безопасности, как насчет того, чтобы просто поменять местами биты. Вы можете просто перевернуть битовую строку, чтобы старший бит стал младшим битом, вторым по величине, вторым по величине и т. Д., Или вы можете выполнить другую случайную перестановку (например, от 1 до 4, от 2 до 7, от 3 до 1 и т. Д.)
Как насчет XOR с простым или двумя? При попытке проанализировать обмен битами кажется очень случайным.
Попробуйте что-нибудь вроде XORing его с простым и самим собой после битового сдвига.
Сколько целых чисел вы хотите зашифровать? С каким объемом ключевых данных вы хотите иметь дело?
Если у вас есть несколько элементов для шифрования, и вы готовы иметь дело с ключевыми данными, длина которых равна длине данных, которые вы хотите зашифровать, то одноразовый блокнот очень прост (просто операция XOR) и математически нерушим.
Недостатком является то, что проблема сохранения ключа в секрете примерно такая же большая, как и проблема сохранения в секрете ваших данных.
У него также есть недостаток (который встречается снова и снова всякий раз, когда кто-то решает попробовать его использовать), что если вы воспользуетесь любыми горячими клавишами - например, с использованием неслучайного ключа или общего ключ ограниченной длины и его повторное использование - это самый слабый шифр из существующих. Ну может ROT13 послабее.
Но если серьезно, если вы шифруете целое число, что вы собираетесь делать с ключом, независимо от того, какой шифр вы выберете? Сохранение ключа в секрете будет проблемой примерно такой же (или даже большей), чем сохранение в секрете целого числа. А если вы шифруете кучу целых чисел, просто используйте стандартный проверенный шифр, который вы найдете во многих криптографических библиотеках.
RC4 будет производить столько вывода, сколько вы хотите, поскольку это потоковый шифр.
Выполните XOR с помощью / dev / random
Похожие вопросы
Связанные вопросы
Новые вопросы
algorithm
Алгоритм - это последовательность четко определенных шагов, которые определяют абстрактное решение проблемы. Используйте этот тег, если ваша проблема связана с дизайном алгоритма.