2010-05-04 8 views
4

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

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

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

ответ

9

Не будет ли эта сумма Block Cipher размера блока = 32 бита?

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

UPDATE: Смотрите также Format preserving encryption

UPDATE 2: RC5 поддерживает 32-64-128 бит для своего размера блока

+0

Да, но я не знаю никаких блок-шифров, которые работают с такими небольшими размерами блоков. – tloflin

+0

Ах, что Skip32 - это то, что я ищу. Является ли это обобщением для n-битовых блоков? – tloflin

+3

FPE - именно то, что я искал, спасибо! – tloflin

0

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

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

0

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

1

простой один:

rand = new Random(k); 
return (i xor rand.Next()) 

(точка исключающее-ки с rand.Next(), а не k является то, что в противном случае, учитывая i и E(i,k), вы можете получить k по k = i xor E(i,k))

0

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

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

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

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

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

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

+1

RC5 - это блок-шифр; вы можете думать о RC4. – caf

+0

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

+0

@caf: вы правы. Я сделал исправление. –

0

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

3

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

+0

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

+0

Действительно, это именно то. –

+0

Циклическая прогулка в сочетании с техникой складывания для уменьшения длины блочного шифрования. –

0

исключающее его/разработчика/случайное

1

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

Смежные вопросы