2014-10-10 5 views
1

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

Есть ли способ, который может работать в симметричной криптографии, обходном пути или альтернативе?

ответ

3

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

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

+2

Обратите внимание, что вам может потребоваться заполнить имена пользователей до определенного размера, если только они не содержат утечки информации о размере имени. –

+0

@ntoskmi Очень плотный ответ. Не могли бы вы указать на ресурс, который мог бы подробнее рассказать о том, что такое ЕЦБ и как известно IV во время дешифрования? – yannisf

+0

@yannisf В Википедии есть статья о [режимах работы] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation). Обратите внимание, в частности, на набор изображений, изображающих пингвина. Вы можете просто отправить IV вместе с зашифрованным текстом; его не нужно хранить в секрете. – ntoskrnl

-1

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

Они достаточно просты в понимании: пусть M - ваш токен, дополненный размером блока, используемым в алгоритме симметричного шифрования (я предполагаю, что это AES), и IV - случайный массив бит, а также размер блок шифрования.

Затем вычислить C = AES_ENCRYPT (M xor IV, K), где C - зашифрованные данные, а K - симметричный ключ. Таким образом, одно и то же сообщение M не будет зашифровываться одинаково много раз, поскольку IV случайным образом получается каждый раз.

Чтобы расшифровать M, просто вычислите M = (AES_DECRYPT (C, K) xor IV).

Конечно, как IV, так и K должны быть известны во время дешифрования. Самый обычный способ передачи IV - просто отправить его по зашифрованному тексту. Это не ставит под угрозу безопасность, это в значительной степени напоминает сохранение значения соли, поскольку ключ шифрования останется неизвестным для всех остальных.

+0

Существует предположение, что данные, которые должны быть зашифрованы, меньше или равны размеру блока, это может быть не так, также нет никакой помощи в том, как заполнять данные таким образом, который является безопасным и может быть удаляется при расшифровке. Общий метод - использовать режим CBC с вариантами заполнения PKCS # 7, где IV - это другое случайное значение для каждого шифрования и префикс для зашифрованных данных. – zaph

+0

Вы правы, возможно, это было неправильное предположение. В таких случаях настоятельно рекомендуется использовать CBC. Чтобы уточнить, режим CBC состоит в выполнении тех же операций, что и в моем ответе, но с использованием предыдущего зашифрованного блока для операции xor вместо вектора инициализации. – agubelu