web-dev-qa-db-fra.com

Sign & Encrypt vs.Crypt & Sign - Que fait GPG?

J'ai déjà lu la discussion Devrions-nous signé-ensuite-chiffrer, ou chiffrer - alors-signe? et le papier Signe défectueux et chiffrement en S/MIME, PKCS # 7, Moss , PEM, PGP et XML . Ma question a à voir avec ce que GPG fait. Cela a été un peu difficile à discerner empiriquement, car la sortie de:

gpg --encrypt --sign <filename>

Change chaque fois que je l'exécute. (Pourquoi?)

@Jens a expliqué qu'une partie de la raison est qu'un horodatage est inclus. Y a-t-il un moyen d'éliminer cela? Je ne vois pas une option GPG.

Comme l'ordre des options ne fait probablement aucune différence et que je ne peux pas utiliser le --detach-sign Option (seul un seul fichier de sortie est produit, peu importe), je soupçonne que la sortie représente:

\begin{equation}
E_r (msg\  \| \ E_s (\#msg))
\end{equation}

$E_r$ est cryptage avec la clé publique du destinataire, $E_s$ est cryptage avec la clé privée de l'expéditeur, $msg$ est le message, $\#msg$ est le hachage du message et $\|$ est la concaténation. c.-à-d. Ce serait "Sign-the-Message-TOCRYPT". Est-ce correct?

Ou est-ce à la place:

\begin{equation}
E_r (msg) \  \| \ E_s (\#msg)
\end{equation}

En d'autres termes, est-ce "chiffrer - alors-signer-utiliser-le-text-texte?" Je suppose que c'est non "Crypter-then-signer-the-cypherext" ($E_r (msg) \ \| \ E_s (\# E_r (msg))$) Comme cela serait compteur à la section 1.2 dans le document mentionné ci-dessus.

@Jens a expliqué qu'il s'agissait effectivement de "signer-the-message-alors-chiffreur". Alors, comment allons-nous "chiffrer-ensuite-signer-utiliser-le-texte-texte", avec la sortie un fichier openpgp unique, plutôt que deux fichiers, une des données cryptées et l'autre la signature?

En outre, j'ai lu les papiers et j'ai lu les manuels - où, autrement que le code lui-même, ierais-je chercher ça?

@Jens suggéré en cours d'exécution:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets 

Je l'ai couru, cryptant à moi-même et j'ai trouvé la sortie ci-dessous. Quelqu'un pourrait-il élucider ce que ça nous dit?

[...]
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]
8
Diagon

Cela a été un peu difficile à discerner empiriquement, car la sortie de:

gpg --encrypt --sign <filename>

change chaque fois que je l'exécute. (Pourquoi?)

Cela a deux raisons:

  1. Le cryptage symétrique dans OpenPGP utilise un vecteur d'initialisation aléatoire (ou plutôt une construction similaire avec un vecteur d'initialisation fixe)
  2. L'horodatage de création de signature est inclus.

Sign & Encrypt vs.Crypt & Sign - Que fait GPG?

GNUPG en premier signe un message, puis le crypte. Vous pouvez vérifier cela en utilisant gpg --list-packets:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets

Ce qui signe d'abord, puis crypte un message, car l'ordre des paquets indique.

De ma compréhension de RFC 4880, openpgp , les deux commandes sont définies, cependant: les messages OpenPGP peuvent être des signatures, des données cryptées, comprimées et littérales, tandis que les signatures sont appliquées sur des messages OpenPGP et que les messages déchiffrés doivent également se former Messages openpgp.

7
Jens Erat