Простое целочисленное шифрование - PullRequest
4 голосов
/ 05 мая 2010

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

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

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

Ответы [ 9 ]

10 голосов
/ 05 мая 2010

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

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

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

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

4 голосов
/ 05 мая 2010

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

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

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

1 голос
/ 05 мая 2010

Простой:

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

0 голосов
/ 04 декабря 2010

XOR это с / dev / random

0 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

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

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

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

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

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

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

0 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

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

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

...