Есть ли две ключевые симметричные коммутативные функции шифрования? - PullRequest
3 голосов
/ 17 июня 2011

Мне интересно, есть ли какая-нибудь надежная (например, AES или около того) функция шифрования, которая работает следующим образом:

  • симметричный
  • 2 ключа: открытый текст -> 2 ключа -> зашифрованный текст, однако не должен иметь значения порядок ключей, т.е.

Ключ1 (Ключ2 (текст)) == Ключ2 (Ключ1 (текст)) например «Коммутативное» (также требуется для расшифровки - вам нужны два ключа, неважно, порядок)

спасибо

Ответы [ 4 ]

7 голосов
/ 17 июня 2011

Это легко сделать, переведя любой алгоритм блочного шифрования в режим CTR . Режим CTR с одной клавишей выглядит так:

ciphertext = plaintext XOR cipher(key, counter)

Где счетчик инициализируется вашим IV и увеличивается для каждого блока. Расшифровка точно такая же операция. Таким образом, если вы дважды шифруете CTR двумя ключами, вы получите:

ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)

И поскольку XOR коммутативен, вы можете изменить его в любом порядке.

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

  1. Алиса и Боб выполняют аутентифицированный обмен Диффи-Хелманна для создания IV. Этот IV затем отправляется Чарли.
  2. Алиса вычисляет дайджест (key0, IV + ctr) для ctr = 0 ... number-of-ciphertext-blocks и отправляет результат KS_A Чарли
  3. Боб вычисляет дайджест (key1, IV + ctr) для ctr = 0 ... number-of-ciphertext-blocks и отправляет результат KS_B Чарли
  4. Чарли вычисляет открытый текст KS_A XOR KS_B XOR и отправляет полученный зашифрованный текст Алисе и Бобу.
  5. Алиса и Боб каждый подписывают кортеж (IV, хэш (зашифрованный текст), описание зашифрованных данных). Это прикреплено к зашифрованному тексту.

Позже, чтобы расшифровать:

  1. Чарли (выполняет расшифровку) отправляет подписанные (IV, хэш (шифротекст)) кортежи каждому из Алисы и Боба, а также зашифрованный текст.
  2. Алиса проверяет свой подписанный кортеж, вычисляет KS_A и отправляет зашифрованный текст XOR KS_A = D_A Чарли
  3. Боб проверяет свой подписанный кортеж, вычисляет KS_B и отправляет зашифрованный текст XOR KS_B = D_B Чарли
  4. Чарли вычисляет KS = D_A XOR D_B = KS_A XOR KS_B
  5. Чарли вычисляет открытый текст = зашифрованный текст XOR KS

Цель подписанного здесь кортежа и обмена DH состоит в том, чтобы гарантировать, что Алису и Боба не удастся обмануть в неправильном потоке, отправив им другой IV. Это может не относиться к вашему сценарию использования. Кроме того, роль Чарли может сыграть Алиса или Боб в реальной реализации.

Если вас беспокоит потенциальная угроза безопасности режима CTR, еще одним вариантом будет использование шифрования в режиме CTR для ключа сеанса, который, в свою очередь, используется для шифрования в более обычном режиме, таком как * 1043. * CBC . То есть:

sessionkey = RANDOM
IV_0 = RANDOM
IV_1 = RANDOM
enc_sessionkey = sessionkey XOR cipher(key0, IV_0) XOR cipher(key1, IV_0)
ciphertext = enc_sessionkey + IV_0 + IV_1 + cipherCBC(IV_1, sessionkey, plaintext)

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

4 голосов
/ 17 июня 2011

Это не коммутативное шифрование, но есть хорошо зарекомендовавшие себя алгоритмы для секретного обмена (заметьте, это , а не то же самое, что и "соглашение о ключах").

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

Чтобы объяснить метод Шамира простыми словами, подумайте о линии на графике. Если вы знаете какие-либо две точки на линии, вы знаете все о линии. Любая строка байтов, такая как ключ шифрования симметричного шифра, представляет собой просто большое число в base-256. Алгоритм Шамира рассматривает этот секрет как «y-перехват» линии (y-координата линии, когда x = 0). Затем наклон линии выбирается случайным образом. Y-координаты линии при x = 1, x = 2, x = 3, & hellip; рассчитываются, и каждый балл присваивается другому акционеру.

Если два любых из этих акционеров соберутся вместе, они могут провести линию через свои две точки обратно к оси Y. Координата Y, в которой она пересекает ось, является исходным секретом. Однако у каждого акционера есть только одно очко; сами по себе они ничего не могут догадаться о первоначальном секрете.

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

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

Вы можете поиграть с реализацией метода Шамира онлайн.

0 голосов
/ 17 июня 2011

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

Кроме того, я не уверен, что вы собираетесь использовать «секретное разделение», как уже упоминалось в atk. Я кратко рассмотрел это, но из того, что я видел (по крайней мере, для основного случая), вы не можете выполнять операции отдельно, поскольку оба ключа должны быть предоставлены вместе для выполнения действий шифрования / дешифрования. Другими словами, вы не можете вызвать шифрование с помощью ключа одного человека, чтобы получить результат, который вы можете вызвать шифрованием с помощью второго ключа. Тем не менее, если у вас есть оба ключа одновременно, это может быть хорошим способом попробовать.

0 голосов
/ 17 июня 2011

Вы говорите о секретном разделении.Да, было много исследований по этому вопросу.Википедия была бы хорошей отправной точкой.

...