Есть ли простой алгоритм шифрования целых чисел? То есть функция E (i, k), которая принимает n-битное целое число и ключ (любого типа) и производит другое несвязанное n-битное целое число, которое при подаче во вторую функцию D (E (i), k) (вместе с ключом) производит исходное целое число?

Очевидно, что есть несколько простых обратимых операций, которые вы можете выполнить, но все они, похоже, дают четко связанные выходные данные (например, последовательные входы приводят к последовательным выходам). Кроме того, конечно, существуют криптостойкие стандартные алгоритмы, но они не дают достаточно малых выходных данных (например, 32-битных). Я знаю, что любую 32-битную криптографию можно использовать методом перебора, но я не ищу чего-то криптографически стойкого, а просто того, что выглядит случайным. Теоретически это должно быть возможно; в конце концов, я мог бы просто создать словарь, случайным образом соединив каждое целое число. Но я надеялся на что-то менее требовательное к памяти.

Изменить: спасибо за ответы. Простые решения XOR не будут работать, потому что аналогичные входные данные будут давать аналогичные выходы.

6
tloflin 5 Май 2010 в 03:03

9 ответов

Лучший ответ

Разве это не соответствует блочному шифру с размером блока = 32 биты?

Не очень популярен, потому что его легко сломать. Но теоретически возможно. Вот одна реализация на Perl: http://metacpan.org/pod/Crypt::Skip32

ОБНОВЛЕНИЕ. См. Также Формат с сохранением шифрования

ОБНОВЛЕНИЕ 2: RC5 поддерживает размер блока 32-64-128 бит.

10
szabgab 4 Апр 2014 в 12:41
Да, но я не знаю никаких блочных шифров, которые работают с такими маленькими размерами блоков.
 – 
tloflin
5 Май 2010 в 03:13
Ах, этот Skip32, кажется, то, что я ищу. Можно ли его обобщить на n-битные блоки?
 – 
tloflin
5 Май 2010 в 03:17
Нет, это не похоже на обобщение. И это не кажется тривиальной проблемой.
 – 
leonbloy
5 Май 2010 в 03:35

Я написал статью некоторое время назад о том, как сгенерировать «криптографически безопасную перестановку» из блочного шифра, которая звучит так, как вы хотите. Он охватывает использование сворачивания для уменьшения размера блочного шифра и трюк для работы с диапазонами, не равными степени двойки.

4
Nick Johnson 5 Май 2010 в 03:44
Спасибо, это была хорошая запись. Похоже, что алгоритм велосипедной ходьбы в статье Леонблой связан.
 – 
tloflin
5 Май 2010 в 03:54
Ходьба на велосипеде в сочетании с техникой складывания для уменьшения длины блочного шифра.
 – 
Nick Johnson
6 Май 2010 в 13:55

Простой:

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) )

2
BlueRaja - Danny Pflughoeft 5 Май 2010 в 03:20

Айден - это алгоритм, который я разработал. Он компактен, быстр и выглядит очень надежно. В настоящее время он доступен для 32- и 64-битных целых чисел. Он находится в общественном достоянии, и вы можете получить его из http://github.com/msotoodeh/integer-encoder.

2
Luca C. 10 Май 2018 в 10:25

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

Вероятно, не криптографически надежный, но в зависимости от ваших требований может быть достаточно.

0
Eric J. 5 Май 2010 в 03:11

Если вы просто хотите выглядеть случайным и не заботитесь о безопасности, как насчет того, чтобы просто поменять местами биты. Вы можете просто перевернуть битовую строку, чтобы старший бит стал младшим битом, вторым по величине, вторым по величине и т. Д., Или вы можете выполнить другую случайную перестановку (например, от 1 до 4, от 2 до 7, от 3 до 1 и т. Д.)

0
bdk 5 Май 2010 в 03:12

Как насчет XOR с простым или двумя? При попытке проанализировать обмен битами кажется очень случайным.
Попробуйте что-нибудь вроде XORing его с простым и самим собой после битового сдвига.

0
Rubys 5 Май 2010 в 03:17

Сколько целых чисел вы хотите зашифровать? С каким объемом ключевых данных вы хотите иметь дело?

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

Недостатком является то, что проблема сохранения ключа в секрете примерно такая же большая, как и проблема сохранения в секрете ваших данных.

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

Но если серьезно, если вы шифруете целое число, что вы собираетесь делать с ключом, независимо от того, какой шифр вы выберете? Сохранение ключа в секрете будет проблемой примерно такой же (или даже большей), чем сохранение в секрете целого числа. А если вы шифруете кучу целых чисел, просто используйте стандартный проверенный шифр, который вы найдете во многих криптографических библиотеках.

RC4 будет производить столько вывода, сколько вы хотите, поскольку это потоковый шифр.

0
Michael Burr 5 Май 2010 в 03:48
1
RC5 - блочный шифр; вы можете думать о RC4.
 – 
caf
5 Май 2010 в 03:21
Сохранение ключа в секрете не будет проблемой, но это должен быть один и тот же ключ каждый раз для неограниченного числа целых чисел. Я считаю, что это означает, что для шифрования с одноразовым блокнотом длина ключа должна быть равна объему конкатенации каждого целого числа. Хотя я не возражаю против больших ключей, они, вероятно, должны быть порядка целочисленной длины.
 – 
tloflin
5 Май 2010 в 03:25

Выполните XOR с помощью / dev / random

0
Liberius 4 Дек 2010 в 01:20