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

111

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

Пример:

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

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

Глен Солсберри
источник

Ответы:

171

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

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

gpg --encrypt --recipient alice@example.com \
    --recipient bob@example.com doc.txt

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

Дэвид Сегондс
источник
То же. Было бы здорово знать, как это сделать, но я не могу найти на нем скрытую страницу руководства.
MarkusQ
@Mitch, я опубликовал ответ, на который может быть наш ответ! (Пожалуйста, проверьте и похвалите, если так / нет - БОЛЬШОЙ признателен!)
pythonlarry
@MarkusQ, см. Мою ссылку на Митча выше. Протестируйте / спасибо, если можете! :-)
pythonlarry
Таким образом, получается 1 зашифрованный файл, который можно прочитать с использованием любого закрытого ключа, а не 1 файл на ключ?
user8675309 01
7
@ user8675309, да. Данные зашифрованы общим симметричным ключом. Только симметричный ключ шифруется открытым ключом каждого получателя. Это не повторное шифрование всех данных для каждого получателя.
wisbucky
55

Да это возможно

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

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

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

gpg --encrypt \
  --recipient alice@example.com \
  --recipient bob@example.com \
clear-message.txt

Клиент GUI

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

Механизм

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

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

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

Эдуард Лопес
источник
4
отдельное спасибо за последние два предложения: теперь они все четко прояснили!
radistao
31

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

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

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

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

я делаю
источник
1
Спасибо за пояснение к зашифрованному документу, который не в n раз больше, где n - количество подписавших.
theartofbeing 05
4

Да, это возможно. Для начала Google "многостороннее шифрование".

AFAIK, нет никаких пакетов drop 'em in and use' em для этого.

- MarkusQ

PS Набросок того, как это можно сделать, рассмотрим вот здесь. Зашифрованное сообщение состоит из:

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

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

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

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

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

MarkusQ
источник
1
Что может показаться отстойным в этом, так это то, что как только вы знаете одноразовый блокнот, у вас есть известный простой текст, а также зашифрованные значения для других ключей. Используя эту информацию, вы можете упростить поиск других ключей.
Kibbee
2
Погуглить "многостороннее шифрование" не так уж и много. Скорее всего, вам повезет больше с «шифрованием широковещательной передачи», которое распространяется и на этот случай.
staktrace
1
@Kibbee: Ключи не секретные, они общедоступные. Так что облегчение выяснения того, что они из себя представляют, не имеет значения. (Эти схемы используются только с ключами, которые могут использоваться только для шифрования, но не для дешифрования.)
Дэвид Шварц
5
Я почти уверен, что в реальных реализациях не используется общий одноразовый блокнот (который должен быть такого же размера, как обычный текст и зашифрованный текст, что удваивает размер сообщения), а фактически используется общий ключ симметричного шифрования. (который обычно намного меньше сообщения).
Иоахим Зауэр
-16

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

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

fi (m) = (p-1) (q-1) (r-1)

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

y1 == x ^ e1 (модуль m)

y2 == y1 ^ e2 (модуль m)

y3 == y2 ^ e3 (модуль m)

...

x == yi ^ d (модуль m)

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

IQfighter
источник