Pour une raison quelconque, j'étais un utilisateur d'Enig Mail (Thunder Bird). Cependant, l'autre jour, j'ai décidé de faire une copie décryptée du courrier chiffré PGP dans un lot. Le décryptage unique peut être effectué en cliquant avec le bouton droit sur le courrier et en sélectionnant «Décrypter dans le dossier», mais le décryptage par lots doit être effectué par «Si OpenPGP est crypté, créer une copie décryptée» du filtre de messagerie. Mais pour une raison quelconque, le filtre ne fonctionnait pas dans mon environnement. Au fait, j'ai trouvé un problème mineur de décodage en cliquant avec le bouton droit de la souris, alors j'ai essayé de le résoudre. C'est https://gitlab.com/enigmail/enigmail/-/merge_requests/47. Dans le processus, j'enquêtais sur https://gitlab.com/enigmail/enigmail/blob/enigmail-2.1-branch/package/persistentCrypto.jsm, mais je pensais que le processus de décryptage serait facile, alors je l'ai implémenté. J'ai essayé.
J'ai choisi Python car c'est le langage avec lequel je suis le plus familier ces jours-ci et l'analyseur de courrier est dans la bibliothèque standard.
IMAP
EnigMail est une extension de ThunderBird, mais un accès IMAP est requis pour que cet outil fonctionne de manière autonome. Cela peut être une copie de https://docs.python.org/ja/3/library/imaplib.html#imap4-example presque entièrement.
GnuPG a été utilisé comme standard de facto. Puisque GnuPG est un programme externe, il nécessite un module de sous-processus. Cependant, subprocess.Popen n'a pas de gestionnaire de contexte. J'ai donc créé un wrapper Popen qui arrêterait le processus si une exception se produisait pendant le bloc (code).
Vous pouvez envoyer le texte à gpg --decrypt --skip-verify
(--skip-verify est requis car vous voulez qu'il soit déchiffré quel que soit le résultat de la vérification). Dans le cas de plusieurs parties, une partie à la fois. Cependant, si Content-Transfer-Encoding est spécifié, il doit être traité à l'avance. Utilisez la chaîne de décodage base64.b64 ou quopri.decode.
Si le contenu est encodé depuis le début (ou s'il contient des caractères multi-octets), il doit être encodé. Cet encodage est une implémentation qui casse la base64 tous les 72 caractères, suivant EnigMail, mais il est nécessaire de casser même si seule la fin est inférieure à 72 caractères (A).
Bien que le nom de fichier du fichier joint soit supprimé, PGP semble avoir une fonction pour incorporer le nom de fichier dans le fichier crypté (?). GnuPG est une option appelée --enable-special-filenames
, et un nom de fichier appelé- & N
peut être incorporé, donc si un nom de fichier dans ce format arrive, il doit être ignoré (B). Cependant, l'outil créé cette fois n'a pas cet effet car il utilise toujours le nom de fichier Content-Disposition au lieu du nom de fichier incorporé.
Notez que (A) et (B) sont le contenu des «défauts mineurs» d'EnigMail.
PGP/MIME
La première des parties MIME est les informations de version (toujours 1), et la seconde est le courrier réel (mais sans l'en-tête). Par conséquent, l'en-tête doit être copié et renvoyé dans le "vrai courrier".
PGP / MIME a écrit que le courrier réel n'inclut pas d'en-tête, mais le chiffrement du sujet d'EnigMail est implémenté en entrant l'en-tête du sujet dans le courrier réel. Par conséquent, lors de la copie de l'en-tête dans le courrier réel, il suffit de ne pas simplement copier l'en-tête qui existe déjà.
Avec https://github.com/cielavenir/imap_mass_decrypter/blob/master/imap_decrypter.py, j'ai pu effectuer avec succès le décryptage par lots (pypi n'est pas utilisé). De plus, le filtre de courrier doit spécifier les dossiers à filtrer un par un, mais ici vous pouvez cibler tous les dossiers à la fois.