3

Я уже читал обсуждение. Должны ли мы подписать, затем зашифровать или зашифровать, а затем подписать? и документ « Неисправный знак и шифрование» в 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 ответ1

5

Это было немного трудно понять эмпирически, так как результат:

gpg --encrypt --sign <filename>

меняется каждый раз, когда я запускаю его. (Зачем?)

Это имеет две причины:

  1. Симметричное шифрование в OpenPGP использует случайный вектор инициализации (или, скорее, аналогичную конструкцию с фиксированным вектором инициализации)
  2. Отметка времени создания подписи включена.

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .