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

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

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

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

Причина моего вопроса в том, что асимметричное шифрование создает огромные файлы. Если бы я отправил сообщение, зашифрованное открытым ключом, на смартфон, оно было бы слишком большим. Особенно если бы оно было зашифровано для нескольких получателей. Одно единственное "Hello" могло бы занять 2 страницы текста. С другой стороны, симметричное шифрование очень плотное.

решение1

Конечно. Просто зашифруйте файл случайным ключом, а затем зашифруйте этот случайный ключ двумя разными симметричными ключами.

решение2

Текущие версии PGP и все GnuPG (GPG) реализуют стандарт OpenPGP. Ниже я буду использовать только термин OpenPGP.

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

Конечно, есть два случая, когда эти накладные расходы могут оказаться значительными по сравнению с зашифрованными данными:

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

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

решение3

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

Я написал инструмент, который делает именно это:https://github.com/galets/AsymmetricCrypt. Для запуска на Linux вам понадобится mono, но в остальном он работает отлично и не требует хранения зашифрованного ключа в отдельном файле.

Связанный контент