Шифрование/дешифрование с несколькими ключами

Можно ли зашифровать данные, чтобы их можно было расшифровать несколькими разными ключами?

Пример:

Я зашифровал данные с помощью ключа 1, но хочу расшифровать их ключами 2, 3 и 4.

Это возможно?

Ответ 1

GnuPG делает стандартное шифрование с несколькими ключами.

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

gpg --encrypt --recipient [email protected] \
    --recipient [email protected] doc.txt

Эта функция подробно описана в разделе "Руководство пользователя" Шифрование и дешифрование документов

Ответ 2

Да возможно

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

Командная строка

Вот как это сделать с помощью командной строки gpg (как описано в ответе Дэвида Сегонса):

gpg --encrypt \
  --recipient [email protected] \
  --recipient [email protected] \
clear-message.txt

Клиент GUI

Ваш графический интерфейс должен предоставить способ шифрования для нескольких пользователей

Механизм

Существует вопрос об информационной безопасности Размер файла GPG с несколькими получателями?, которые объясняют механизм шифрования:

GPG шифрует файл один раз симметричным ключом, затем помещает заголовок идентификации целевой пары ключей и зашифрованной версии симметричный ключ.

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

Ответ 3

GnuPG и клиенты PGP обычно обычно шифруют фактические данные с помощью симметричного ключа, называемого "сеансовым ключом". Затем ключ сеанса зашифровывается каждым "ключом получателя" (т.е. Те, которые вы указываете с -r/- получателем). Это иногда называют гибридным шифром . Сейчас я считаю, что GnuPG по умолчанию использует 256-битные ключи сеанса и AES для шифрования данных открытого текста для этого сеанса AES-256, а вашими ключами-получателями являются RSA/DSA/ECDSA/etc. асимметричный ключ в этом случае.

Одна из причин для этого заключается в том, что симметричные криптографические алгоритмы, такие как AES, обычно намного быстрее, чем асимметричные, такие как RSA. Таким образом, GnuPG должен только шифровать ~ 256 бит (ключ сеанса) с RSA и может использовать AES для шифрования данных (таких больших, как вы этого хотите!) С помощью этого ключа сеанса. У процессоров Intel даже есть встроенная инструкция AES-NI, чтобы сделать некоторые шаги алгоритма в аппаратном обеспечении, что делает GnuPG более быстрым при шифровании/расшифровке данных.

Другая причина для этого заключается в том, что он позволяет шифровать PGP-документы для нескольких сторон без необходимости удвоения размера документа. Обратите внимание, что при указании нескольких получателей для зашифрованного документа (например, gpg -ea -r Alice -r Bob -o ciphertext.asc) зашифрованный документ, который хранится (ciphertext.asc), не равен 2x, как если бы вы просто зашифровали его в Alice.

См. также параметр --show-session-key на странице gpg man, чтобы иметь возможность расшифровать только ключ сеанса, например, чтобы позволить третьему лицу расшифровать документ который зашифрован вам без необходимости передавать им ваш закрытый ключ или данные открытого текста.

Ответ 4

Да, это возможно. Google "многопартийное шифрование" для запуска.

AFAIK, там нет падений и использовать для этого пакеты em.

- MarkusQ

P.S. Для иллюстрации того, как это можно сделать, рассмотрите это. Зашифрованное сообщение состоит из:

  • полезная нагрузка, зашифрованная одноразовой панелью
  • одноразовый блокнот, зашифрованный с помощью ключа1
  • одноразовая панель, зашифрованная с помощью key2
  • ...
  • одноразовый блок, зашифрованный с помощью ключаN

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

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

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

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

Ответ 5

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

т = р * д * г; p, q, r - большие простые числа

ц (т) = (р-1) (Q-1) (г-1)

d == (e1 * e2 * e3 *... * ei) ^ (- 1) (mod fi (m)); e1... ei - произвольные числа, d вычисляется для выполнения уравнения

y1 == x ^ e1 (mod m)

y2 == y1 ^ e2 (mod m)

y3 == y2 ^ e3 (mod m)

...

x == yi ^ d (mod m)

Этот алгоритм может использоваться, например, для увеличения скорости лукового маршрутизатора.