Wie erstelle ich eine einzige GnuPG-Signatur, die sowohl für die LF- als auch für die CR / LF-Version einer Datei funktioniert?

777
Bill Evans at Mariposa

Ich habe eine Textdatei mit nur LF (Zeilenvorschub) am Ende jeder Zeile erstellt. Ich machte dann eine Version, die identisch war, außer dass sie am Ende jeder Zeile CR / LF (Wagenrücklauf / Zeilenvorschub) hatte.

Dann gpg2habe ich mit Version 2.0.19 für jede Datei eine separate Signatur erstellt. Jede Datei wurde mit der korrekten Signatur korrekt überprüft, konnte dies jedoch nicht tun, wenn für jede Datendatei die falsche Signatur verwendet wurde.

Soweit würde ich erwarten.

Ich besitze jedoch eine Textdatei und deren getrennte Unterschrift. Ich habe jetzt zwei Versionen der Textdatei, eine im LF-Stil und eine im CR / LF-Stil. Dieselbe getrennte Signatur funktioniert bei beiden ordnungsgemäß.

Wie hat der ursprüngliche Unterzeichner das geschafft? Das würde ich gerne tun können.

2

1 Antwort auf die Frage

2
Jens Erat

tl; dr: Einstellung der --textmodeOption.

Aus RFC 4880, 5.2.4. Rechensignaturen :

5.2.4. Unterschriften berechnen

Alle Signaturen werden gebildet, indem ein Hash über den Signaturdaten erzeugt wird und dann der resultierende Hash im Signaturalgorithmus verwendet wird.

Bei binären Dokumentsignaturen (Typ 0x00) werden die Dokumentdaten direkt gehasht. Bei Textdokumentunterschriften (Typ 0x01) wird das Dokument kanonisiert, indem Zeilenenden in konvertiert werden <CR><LF>, und die resultierenden Daten werden gehasht.

Mit anderen Worten, Sie müssen sicherstellen, dass GnuPG das Dokument beim Signieren als Textdokument behandelt. Dies muss mit der --textmodeOption aktiviert werden :

gpg --textmode --detach --sign file 

Beim Ausführen gpg --list-packets signature-filewerden Sie die verschiedenen Signaturtypen aus RFC 4880 beobachten, wobei die zweite Zeile sigclass 0x01mit --textmodeset anstelle von sigclass 0x00ohne enthält.

From man gpg(das gleiche gilt für GnuPG 2):

-t, --textmode
--no-textmode

Behandeln Sie Eingabedateien als Text und speichern Sie sie in der kanonischen OpenPGP-Textform mit den standardmäßigen Zeilenenden "CRLF". Dadurch werden auch die erforderlichen Flags gesetzt, um den Empfänger darüber zu informieren, dass die verschlüsselten oder signierten Daten Text sind und die Zeilenenden möglicherweise in das vom lokalen System verwendete konvertiert werden müssen. Diese Option ist nützlich, wenn zwischen zwei Plattformen mit unterschiedlichen Zeilenendkonventionen (UNIX-like Mac, Mac zu Windows usw.) kommuniziert wird. --no-textmodeDeaktiviert diese Option und ist die Standardeinstellung.

Wenn -t (jedoch nicht --textmode) zusammen mit der Bewaffnung und der Signatur verwendet wird, werden hiermit zu löschende Nachrichten aktiviert. Dieser Befehl wird für die Befehlszeilen-Kompatibilität mit Befehlszeilenversionen von PGP benötigt. Normalerweise würden Sie --signoder verwenden --clearsign, um den Typ der Signatur auszuwählen.