OpenPGP шифрование
В OpenPGP сообщение не зашифровано напрямую с помощью ключевой фразы. Вместо этого случайный сеансовый ключ генерируется как ключ для симметричного шифрования сообщения.
Этот ключ сеанса теперь шифруется с использованием ключевой фразы. Применяя такой двухэтапный подход, можно зашифровать сообщение один раз, но разрешить дешифрование с использованием разных закрытых ключей или парольных фраз, добавив зашифрованную копию ключа сеанса один раз. Для более глубокого понимания того, как создаются сообщения OpenPGP, взгляните на RFC 4880, OpenPGP и вывод зашифрованного сообщения gpg --list-packets
и pgpdump
для него (оба они печатают информацию в пакетах OpenPGP).
Кроме того, каждое сообщение дополняется случайными байтами, что также приводит к совершенно другому сообщению. Наконец, зашифрованное сообщение хранит метку времени шифрования, которая, очевидно, будет другой, если вы не зашифруете дважды в одну и ту же секунду.
Очень важно иметь разные выходные данные при двойном шифровании одного и того же сообщения: информация о том, что два сообщения на самом деле являются одним и тем же сообщением, часто уже является проблемой. Имея случайные ключи сеанса и заполнение, злоумышленник не может делать какие-либо предположения относительно содержимого сообщения, если он получает несколько сообщений.
Уникальное ограничение на зашифрованный вывод
Если вам необходимо иметь уникальное ограничение для сообщения, рассчитайте криптографическую хеш-сумму (например, SHA-256) для сообщения и сохраните ее дополнительно (и вычислите уникальное ограничение на хеш-сумму вместо зашифрованного сообщения).