Шифрование с несколькими разными ключами? - PullRequest
96 голосов
/ 28 февраля 2009

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

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

Возможно ли это?

Ответы [ 5 ]

145 голосов
/ 28 февраля 2009

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

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

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

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

49 голосов
/ 18 мая 2014

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

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

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

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

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

GUI клиент

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

Механизм

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

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

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

26 голосов
/ 29 января 2015

GnuPG и клиенты PGP в целом обычно шифруют фактические данные с помощью симметричного ключа, называемого "ключом сеанса". Затем ключ сеанса шифруется каждым «ключом получателя» (т. Е. Теми, которые вы указываете с -r / - получателем). Это иногда называют гибридным шифром . Сейчас я считаю, что 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 , чтобы иметь возможность расшифровывать только сессионный ключ, например, чтобы позволить третьей стороне расшифровать зашифрованный для вас документ без необходимости передайте им свой закрытый ключ или данные в открытом виде.

4 голосов
/ 28 февраля 2009

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

AFAIK, в них нет дроп-ин и используйте их пакеты.

- MarkusQ

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

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

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

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

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

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

0 голосов
/ 13 июля 2011

Многократный (более двух) ключ 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)

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

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