Sign & Encrypt vs. Encrypt & Sign - что делает GPG?
Я уже читал обсуждение. Должны ли мы подписать, затем зашифровать или зашифровать, а затем подписать? и документ " Дефектная подпись и шифрование" в S/MIME, PKCS#7, MOSS, PEM, PGP и XML. Мой вопрос касается того, что делает gpg. Это было немного сложно определить эмпирически, так как результат:
gpg --encrypt --sign <filename>
Изменения каждый раз, когда я запускаю его. (Зачем?)
@Jens объяснил, что отчасти причина в том, что указана временная метка. Есть ли способ устранить это? Я не вижу опцию gpg.
Поскольку порядок опций, по-видимому, не имеет значения, и так как я не могу использовать --detach-sign
опция (независимо от того, что создается только один файл вывода), я подозреваю, что вывод представляет:
\begin{equation}
E_r (msg\ \| \ E_s (\#msg))
\end{equation}
где $E_r$
шифрование с открытым ключом получателя, $E_s$
шифрование с помощью закрытого ключа отправителя, $msg$
это сообщение, $\#msg$
это хеш сообщения и $\|$
это конкатенация. то есть. это будет "подписать сообщение, затем шифровать". Это правильно?
Или вместо этого:
\begin{equation}
E_r (msg) \ \| \ E_s (\#msg)
\end{equation}
Другими словами, это "зашифровать, затем подписать, используя обычный текст?". Я предполагаю, что это не "зашифровать, а затем подписать, зашифрованный текст". ($E_r (msg) \ \| \ E_s (\# E_r (msg))$)
поскольку это противоречило бы Разделу 1.2 в упомянутом выше документе.
@Jens объяснил, что это действительно "подписать-сообщение-затем-зашифровать". Итак, как бы нам "зашифровать-затем-подписать-используя-простой-текст" с выводом одного файла openpgp, а не два файла, один зашифрованный данные, а другой подпись?
Кроме того, я прочитал бумаги и прочитал руководства - куда, кроме самого кода, я бы пошел, чтобы посмотреть это?
@Jens предложил запустить:
echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets
Я запустил его, зашифровав для себя и обнаружив вывод ниже. Может ли кто-нибудь объяснить, что это говорит нам?
[...]
gpg: okay, we are the anonymous recipient.
:encrypted data packet:
length: unknown
mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
:compressed packet: algo=2
:onepass_sig packet: keyid C6701618143AFA1E
version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
mode b (62), created 1443494042, name="",
raw data: 4 bytes
:signature packet: algo 1, keyid C6701618143AFA1E
version 4, created 1443494042, md5len 0, sigclass 0x00
digest algo 10, begin of digest d7 3a
hashed subpkt 2 len 4 (sig created 2015-09-29)
subpkt 16 len 8 (issuer key ID C6701618143AFA1E)
data: [4095 bits]
1 ответ
Это было немного сложно определить эмпирически, так как результат:
gpg --encrypt --sign <filename>
меняется каждый раз, когда я запускаю его. (Зачем?)
Это имеет две причины:
- Симметричное шифрование в OpenPGP использует случайный вектор инициализации (или, скорее, аналогичную конструкцию с фиксированным вектором инициализации)
- Отметка времени создания подписи включена.
Sign & Encrypt vs. Encrypt & Sign - что делает gpg?
GnuPG сначала подписывает сообщение, затем шифрует его. Вы можете проверить это используя gpg --list-packets
:
echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets
Который сначала подписывает, а затем шифрует сообщение, как указывает порядок пакетов.
Из моего понимания RFC 4880, OpenPGP, оба порядка определены, хотя: сообщения OpenPGP могут быть сигнатурами, зашифрованными, сжатыми и буквальными данными, тогда как сигнатуры применяются к сообщениям OpenPGP, а дешифрованные сообщения также должны формировать сообщения OpenPGP.