[PYTHON] Entschlüsseln Sie PGP-verschlüsselte E-Mails in großen Mengen

Hintergrund

Aus irgendeinem Grund war ich ein Benutzer von Enig Mail (Thunder Bird). Neulich habe ich mich jedoch entschlossen, eine entschlüsselte Kopie von PGP-verschlüsselten E-Mails in einem Stapel zu erstellen. Eine einzelne Entschlüsselung kann durch Klicken mit der rechten Maustaste auf die E-Mail und Auswahl von "In Ordner entschlüsseln" erfolgen. Die Stapelentschlüsselung muss jedoch über "Wenn OpenPGP verschlüsselt eine entschlüsselte Kopie erstellen" des E-Mail-Filters erfolgen. Der Filter funktionierte jedoch aus irgendeinem Grund in meiner Umgebung nicht. Übrigens habe ich beim Klicken mit der rechten Maustaste ein kleines Problem beim Dekodieren festgestellt, also habe ich versucht, es zu beheben. Das ist https://gitlab.com/enigmail/enigmail/-/merge_requests/47. Dabei habe ich https://gitlab.com/enigmail/enigmail/blob/enigmail-2.1-branch/package/persistentCrypto.jsm untersucht, aber ich dachte, dass der Entschlüsselungsprozess einfach sein würde, also habe ich ihn implementiert. Ich habe es versucht.

Methode

Sprache

Ich habe mich für Python entschieden, weil es die Sprache ist, mit der ich in diesen Tagen am besten vertraut bin, und der Mail-Parser sich in der Standardbibliothek befindet.

IMAP

EnigMail ist eine Erweiterung von ThunderBird, aber IMAP-Zugriff ist erforderlich, damit dieses Tool eigenständig funktioniert. Dies kann eine Kopie von https://docs.python.org/ja/3/library/imaplib.html#imap4-example sein.

Email

Entschlüsselungsmaschine

GnuPG wurde als De-facto-Standard verwendet. Da GnuPG ein externes Programm ist, ist ein Unterprozessmodul erforderlich. Subprocess.Popen verfügt jedoch nicht über einen Kontextmanager. Also habe ich einen Popen-Wrapper erstellt, der den Prozess stoppt, wenn während des (Code-) Blocks eine Ausnahme auftritt.

Normale Verschlüsselung

Sie können den Text an gpg --decrypt --skip-verify senden (--skip-verify ist erforderlich, da er unabhängig vom Überprüfungsergebnis entschlüsselt werden soll). Bei mehrteiligen Teilen jeweils ein Teil. Wenn jedoch Content-Transfer-Encoding angegeben ist, muss es im Voraus verarbeitet werden. Verwenden Sie die Zeichenfolge base64.b64 decode oder quopri.decode. Wenn der Inhalt Mehrbytezeichen enthält (oder wenn der Inhalt von Anfang an codiert ist), muss er codiert werden. Diese Codierung ist eine Implementierung, bei der Base64 nach EnigMail alle 72 Zeichen unterbrochen wird. Es ist jedoch erforderlich, die Gewinnschwelle zu überschreiten, wenn nur das Ende weniger als 72 Zeichen (A) beträgt. Obwohl der Dateiname der angehängten Datei entfernt wird, scheint PGP eine Funktion zum Einbetten des Dateinamens in die verschlüsselte Datei (?) Zu haben. GnuPG ist eine Option namens "--enable-special-filenames", und ein Dateiname namens "& N" kann eingebettet werden. Wenn also ein Dateiname in diesem Format eingeht, sollte er ignoriert werden (B). Das diesmal erstellte Tool hat diesen Effekt jedoch nicht, da immer der Dateiname Content-Disposition anstelle des eingebetteten Dateinamens verwendet wird. Darüber hinaus sind diese (A) und (B) der Inhalt "geringfügiger Mängel" von EnigMail.

PGP/MIME

Der erste der MIME-Teile ist die Versionsinformation (immer 1), und der zweite ist die eigentliche Mail (jedoch ohne den Header). Daher sollte der Header kopiert und an die "echte Mail" zurückgegeben werden.

Betreff-Verschlüsselung

PGP / MIME schrieb, dass die eigentliche Mail keinen Header enthält, die Betreffverschlüsselung von EnigMail jedoch durch Eingabe des Betreff-Headers in die eigentliche Mail implementiert wird. Daher reicht es beim Kopieren des Headers in die eigentliche Mail aus, den bereits vorhandenen Header nicht einfach zu kopieren.

Ergebnis

Mit https://github.com/cielavenir/imap_mass_decrypter/blob/master/imap_decrypter.py konnte ich die Stapelentschlüsselung erfolgreich durchführen (Pypi wird nicht verwendet). Darüber hinaus muss der E-Mail-Filter die zu filternden Ordner einzeln angeben. Hier können Sie jedoch alle Ordner gleichzeitig als Ziel festlegen.

Recommended Posts

Entschlüsseln Sie PGP-verschlüsselte E-Mails in großen Mengen
Laden Sie LinkData-Datensätze in großen Mengen herunter
Lesen Sie Outlook-E-Mails mit Python