Существует ли простой алгоритм для шифрования целых чисел? Таким образом, функция E (я, k), который принимает n-bit целое число и ключ (какого-либо типа) и производит другого, несвязанное n-bit целое число что при питании во вторую функцию D (E (i), k) (наряду с ключом) производит исходное целое число?
Очевидно, существуют некоторые простые обратимые операции, которые можно выполнить, но они все, кажется, производят ясно связанные выводы (например, последовательный вывод исходных данных к последовательным выводам). Кроме того, конечно, существуют криптографически сильные стандартные алгоритмы, но они не производят достаточно маленькие выводы (например, 32-разрядный). Я знаю, что любая 32-разрядная криптография может быть вынуждена скотами, но я не ищу что-то криптографически сильное, просто что-то, что выглядит случайным. Теоретически разговор его должен быть возможным; в конце концов, я мог просто создать словарь путем случайного соединения каждого целого числа. Но я надеялся на что-то немного менее интенсивно использующее память.
Править: Спасибо за ответы. Простые решения XOR не будут работать, потому что подобные исходные данные произведут подобные выводы.
Разве это не составит блочный шифр с размером блока = 32 бита?
Не очень популярен, потому что его легко перерыв. Но теоретически возможно. Вот одна реализация на Perl: http://metacpan.org/pod/Crypt::Skip32
ОБНОВЛЕНИЕ: см. Также Сохранение формата encryption
ОБНОВЛЕНИЕ 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)
)
Вы можете взять n-битный хэш вашего ключа (предполагая, что он закрытый) и XOR этого хэша с исходным целым числом для шифрования и с зашифрованным целым числом для расшифровки.
Вероятно, криптографически не очень надежно, но в зависимости от ваших требований, может быть достаточно.
Если вы просто хотите выглядеть случайно и не заботитесь о безопасности, как насчет того, чтобы просто поменять биты местами. Можно просто перевернуть битовую строку, так что старший бит становится младшим, второй старший, второй младший и т.д., или можно сделать другую случайную перестановку (например, 1 к 4, 2 к 7 3 к 1 и т.д.).
Сколько целых чисел вы хотите зашифровать? С каким объемом ключевых данных вы хотите иметь дело?
Если у вас есть несколько элементов, которые нужно зашифровать, и вы готовы иметь дело с ключевыми данными, длина которых равна длине данных, которые вы хотите зашифровать, то одно- time-pad очень прост (просто операция XOR) и математически нерушим.
Недостатком является то, что проблема сохранения ключа в секрете примерно такая же большая, как и проблема сохранения секретности ваших данных.
У него также есть недостаток (который встречается снова и снова всякий раз, когда кто-то решает попытаться его использовать), что если вы выберете любые ярлыки - например, использование неслучайного ключа или обычного ключа использование ключа ограниченной длины и его повторное использование - это самый слабый существующий шифр. Ну может ROT13 послабее.
Но если серьезно, если вы шифруете целое число, что вы собираетесь делать с ключом, независимо от того, какой шифр вы выберете? Сохранение ключа в секрете будет проблемой примерно такой же (или даже большей), чем сохранение в секрете целого числа. А если вы шифруете кучу целых чисел, просто используйте стандартный проверенный шифр, который вы найдете во многих криптографических библиотеках.
RC4 будет производить столько вывода, сколько вы хотите, поскольку это потоковый шифр.
Некоторое время назад я написал статью о том, как сгенерировать "криптографически безопасную перестановку" из блочного шифра, что похоже на то, что вам нужно. В ней рассказывается об использовании складывания для уменьшения размера блочного шифра, а также о трюке для работы с диапазонами, не равными 2.
Как насчет XOR с праймом или двумя? Замена битов местами кажется очень случайной при попытке анализа.
Попробуйте что-нибудь вроде XORing с простым и самим собой после сдвига битов.