Симметричное целочисленное шифрование - PullRequest
10 голосов
/ 27 октября 2010

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

Что-то вроде:

encrypt(1, "secret key") == 67123571122
decrypt(67123571122, "secret key") == 1

Этот парень задает почти тот же вопрос: Симметричный биективный алгоритм для целых чисел
однако я являюсь полным шифрованием "n00b". Я хотел бы получить несколько более практических примеров, если возможно, в python.1010 * Я понимаю, что мне нужно использовать какой-нибудь блочный шифр, но я довольно растерялся из-за того, что зашифрованный результат все еще должен быть числовым и несколько коротким (возможно, длинным вместо целого)

Любойуказатели?Спасибо

ОБНОВЛЕНИЕ- Почему я хочу это сделать?
У меня есть веб-сервис, где каждый «объект» получает URL, например: example.com/thing/123456/

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

Материал на этих страницах не является «совершенно секретным» или чем-то подобным, но не так-то просто его можно будет отследитьв некотором другом случайном объекте, просто увеличивая этот идентификатор в URL.

Таким образом, при некотором двухстороннем числовом шифровании идентификаторы URL-адресов вообще не будут последовательными, и кому-то понадобится совсем немного времени, чтобы найти больше этих объектов.(Кроме того, запросы регулируются)

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

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

Ответы [ 5 ]

3 голосов
/ 27 октября 2010

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

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

В RC4 есть несколько предостережений, поэтому сначала прочтите его.

Блочные шифры в этом случае не будут вашими друзьями, поскольку все они имеют размеры блоков от 64 бит и более. Это означает, что вам нужно добавить 32-битное целое число в 64-битное, и вы получите обратно 64-битное значение ... но вы не можете выбрать, какие 32 оставить. Вы не сможете расшифровать его только с половиной бит. Если вы счастливы перейти на длинные позиции, вы можете использовать 3DES или Blowfish.

Все зависит от того, что именно вы шифруете и почему, поэтому сложно дать однозначный ответ. Я надеюсь, что это дает представление о том, с чего начать, по крайней мере.

1 голос
/ 27 октября 2010

Ответ, который я разместил на этот вопрос, относится и к вашему: используйте короткий блочный шифр.Предполагая, что ваши идентификаторы 64-битные, вы можете просто использовать шифр XTEA как есть, с 64-битным целым числом в качестве блока данных.

1 голос
/ 27 октября 2010

Вы можете посмотреть этот документ: Совершенные блочные шифры с небольшими блоками и слайды презентации на конференции FSE 2007.

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

0 голосов
/ 15 мая 2015

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

0 голосов
/ 27 октября 2010

Вы хотите зашифровать только один int, то есть q 32/64 битное число?
Тогда самый простой способ - просто XOR с 32/64-битным секретным ключом.

...