возможно ли идеальное хеширование без ведер? - PullRequest
1 голос
/ 03 февраля 2011

Меня попросили найти идеальную хеш / одностороннюю функцию, чтобы можно было хешировать 10 ^ 11 чисел.Однако, поскольку мы будем использовать встроенное устройство, у него не будет памяти для хранения соответствующих блоков, поэтому мне было интересно, можно ли получить приличный (минимальный) идеальный хеш без них?

План состоит в том, чтобы использоватьустройство для хеширования числа и мы используем радужную таблицу или файл, используя хэш в качестве смещения.

Cheers

Редактировать:

Я попробуючтобы предоставить больше информации:)

1) 10 ^ 11 на самом деле теперь 10 ^ 10, так что это облегчает. Это число возможных комбинаций.Таким образом, мы могли бы получить число от 0000000001 до 10000000000 (10 ^ 10).

2) План состоит в том, чтобы сделать его частью односторонней функции, чтобы сделать число защищенным, чтобы мы могли отправить его небезопасными средствами,Затем мы найдем исходное число на другом конце, используя радужный стол.Проблема заключается в том, что исходные устройства обычно имеют 512К-4Мег памяти для использования.

3) это должно быть идеально - у нас 100% не может быть коллизий.

Edit2:

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

Edit3:

Поскольку это не имеет смысла, сейчас это чисто академический вопрос (обещаю)

Ответы [ 2 ]

7 голосов
/ 03 февраля 2011

Хорошо, так как вы пояснили, что вы пытаетесь сделать, я переписал свой ответ.

Подводя итог: используйте настоящий алгоритм шифрования.

Сначала позвольте мне перейтипочему ваша система хеширования - плохая идея.

Что такое ваша система хеширования?

Насколько я понимаю, ваша предложенная система выглядит примерно так:

Ваша встроенная системаСистема (которую я назову C) посылает какие-то данные с пространством значений 10 ^ 11.Эти данные должны храниться в тайне при передаче на какой-либо сервер (который я назову S).

Ваше предложение состоит в том, чтобы отправить значение hash(salt + data) в S. Затем S использует радужную таблицу для обратногоэто хеш и восстановить данные.salt является общим значением, известным как C, так и S.

Это алгоритм шифрования

Алгоритм шифрования, когда вы его сводите, любой алгоритм, который дает вамконфиденциальность .Поскольку ваша цель - конфиденциальность, любой алгоритм, который удовлетворяет вашим целям, является алгоритмом шифрования , включая этот.

Это очень плохой алгоритм шифрования

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

Во-вторых, дешифрование требует очень много ресурсов процессора и памяти даже для легитимного сервера S. Изменение соли еще дороже.

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

В-четвертых, его можно использовать только от C до S. Ваша встроенная система C не будет иметь достаточно вычислительных ресурсов для обратного хеширования и можеттолько отправлять данные.

Это не быстрее реального алгоритма шифрования на встроенном устройстве

Большинство алгоритмов безопасного хеширования столь же вычислительно дороги, как и разумный блочный шифр, если не хуже.Например, SHA-1 требует выполнения следующих действий для каждого 512-битного блока:

  • Выделение 12 32-битных переменных.
  • Выделение 80 32-битных слов для расширенного сообщения
  • 64 раза: выполнить три поиска в массиве, три 32-разрядных xors и операцию поворота
  • 80 раз: выполнить до пяти 32-разрядных двоичных операций (некоторая комбинация xor и, или, не, а и в зависимости от раунда);затем вращение, поиск в массиве, четыре добавления, другое вращение и несколько загрузок / сохранений памяти.
  • Выполнение пяти 32-разрядных добавлений по два дополнения

Существует один блок на 512-биты сообщения, плюс возможный дополнительный фрагмент в конце.Это 1136 двоичных операций на блок (не считая операций с памятью) или около 16 операций на байт.

Для сравнения, алгоритм шифрования RC4 требует четырех операций (три добавления, плюс xor в сообщении) на байт, плюс два чтения массива и два записи массива.Для этого также требуется только 258 байт рабочей памяти против пика в 368 байт для SHA-1.

Управление ключами является фундаментальным

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

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

Таким образом, секреты, как правило, легко заменить - это то, что мы называемключ.

Предполагаемое использование хеш-алгоритмов потребует соли - это секрет only в системе и, следовательно, ключ. Нравится вам это или нет, вам придется тщательно управлять этим ключом. Заменить его намного сложнее, если он утек, чем другие ключи - вам приходится тратить много часов ЦП на создание новой радужной таблицы при каждой ее замене!

Что делать?

Используйте настоящий алгоритм шифрования и потратьте некоторое время на размышления об управлении ключами. Эти проблемы были решены ранее.

Сначала используйте реальный алгоритм шифрования. AES был разработан для высокой производительности и низких требований к оперативной памяти. Вы также можете использовать потоковый шифр, такой как RC4, как я уже упоминал ранее - однако при использовании RC4 следует остерегаться того, что вы должны отбросить первые 4 килобайта или около того выходных данных шифра, иначе вы будете уязвимы к тому же атаки, которые преследовали WEP.

Во-вторых, подумайте об управлении ключами. Один из вариантов - просто записать ключ в каждого клиента и физически выйти и заменить его, если клиент скомпрометирован. Это разумно, если у вас есть легкий физический доступ ко всем клиентам.

В противном случае, если вас не волнует атака «человек посередине», вы можете просто использовать Обмен ключами Диффи-Хеллмана для согласования общего ключа между S и C. Если вас это беспокоит Что касается MitM, то вам нужно начать смотреть на ECDSA или что-то для аутентификации ключа, полученного от обмена DH - будьте осторожны, однако, когда вы начинаете идти по этому пути, легко ошибиться. Я бы порекомендовал реализовать TLS на этом этапе. Это не выходит за рамки возможностей встроенной системы - действительно, существует число встроенных коммерческих (и с открытым исходным кодом) библиотек доступно уже. Если вы не внедрили TLS, то, по крайней мере, попросите профессионального криптографа просмотреть ваш алгоритм перед его реализацией.

1 голос
/ 03 февраля 2011

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

Однако вряд ли вы будете хранить все числа от 0 до 10 ^ 11. Так что же за образец? Если есть шаблон, может быть идеальная хеш-функция для вашего фактического набора данных.

Правда, в любом случае не так важно найти «идеальную» хеш-функцию. Хеш-таблицы очень быстрые. Функция с очень низкой частотой столкновений - и при хешировании целых чисел это означает, что почти любая простая функция, например модуль, - это хорошо, и вы получите среднюю производительность O (1).

...