PDFiumPas schreibt ISO/TS-32003-Verschlüsselung über SaveAsEncrypted: Setzen Sie Revision auf erR7, und jeder String und Stream wird mit AES-256 im GCM-Modus geschützt, dem authentifizierten Chiffrierverfahren, das PDF 2.0 im Jahr 2023 erhalten hat. Setzen Sie zusätzlich EnableIntegrityProtection, und das Dokument trägt auch ein eigenständiges PDF-MAC-Token, das ValidatePdfMac auf der Leseseite prüft
Das sind zwei verschiedene Schutzmechanismen, die routinemäßig verwechselt werden. GCM authentifiziert jeden verschlüsselten Wert. Der MAC authentifiziert das Dokument als Ganzes. Man will beides, aus unterschiedlichen Gründen
Was fügt GCM hinzu, das CBC nie geboten hat?
Authentifizierung des Chiffretexts. AES-256 im CBC-Modus, das AESV3-Schema in ISO 32000-2, hält Inhalte vertraulich und sagt nichts darüber, ob sie unverändert angekommen sind. CBC ist auf spezifische, gut untersuchte Weise formbar: Ein Angreifer, der Bits im Chiffretext kippen kann, erzeugt vorhersagbare Änderungen im Klartext des folgenden Blocks, und nichts im Format bemerkt es
GCM schließt das. Jeder verschlüsselte Wert trägt ein 16 Byte großes Authentifizierungs-Tag, vollständig serialisiert, wie ISO/TS 32003 es verlangt, und die Entschlüsselung schlägt fehl, statt geändertem Klartext zurückzugeben, wenn das Tag nicht passt. In PDF-Begriffen ist ein manipulierter String oder Stream in einem AESV4-Dokument ein harter Fehler an der Stelle der Verwendung, kein seltsamer Wert, der sich in die eigene Anwendung fortpflanzt. Das Encrypt-Dictionary markiert das mit /CFM /AESV4 und V 6 / R 7, zusammen mit einem Extensions-Eintrag, der /ExtensionLevel 32003 und /ExtensionRevision (:2023) deklariert
Drei Revisionen, drei Ökosysteme
TPdfEncryptionRevision bietet erR5, erR6 und erR7, und die Wahl ist eher eine Kompatibilitäts- als eine kryptografische Entscheidung. R5 ist das ursprüngliche, als PDF-1.7-Erweiterung veröffentlichte AES-256-Schema mit einem einzelnen SHA-256-Passworthash, und es öffnet sich in im Wesentlichen allem aus den letzten fünfzehn Jahren. R6 ist die gehärtete Schlüsselableitung, standardisiert in ISO 32000-2, mit der iterierenden SHA-256/384/512-Konstruktion von Algorithmus 2.B, und das erwartet ein aktueller PDF-2.0- oder PDF/A-4-Workflow. R7 ist ISO/TS 32003, mit derselben 2.B-Ableitung, aber AES-GCM als Chiffre
Die Reader-Unterstützung läuft genau in dieser Reihenfolge, und die R7-Unterstützung ist außerhalb aktueller Mainstream-Viewer noch dünn. Das ist derselbe Kompromiss, der jedes PDF-2.0-Feature bestimmt: die neueste Option ist die beste Ingenieurskunst und das schmalste Publikum. Entscheiden Sie danach, wer die Datei öffnen muss, und lautet diese Antwort "ein Archivsystem, das seit 2019 niemand aktualisiert hat", ist die Antwort R5, unabhängig davon, was die Sicherheitsrichtlinie bevorzugt
uses
PDFium, FPdfEncrypt;
var
Pdf: TPdf;
Opts: TPdfEncryptOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'quarterly-report.pdf';
Pdf.LoadDocument;
Opts := TPdfEncryptOptions.Default;
Opts.UserPassword := 'open-secret';
Opts.OwnerPassword := 'admin-secret';
Opts.EncryptMetadata := True;
Opts.Revision := erR7; // ISO/TS 32003 AESV4-GCM
Opts.EnableIntegrityProtection := True; // eigenständiges PDF-MAC-Token
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
Warum ein Dokument-MAC zusätzlich zu einer authentifizierten Chiffre?
Weil GCM-Tags die Werte schützen, nicht die Anordnung der Werte. Jeder String und Stream in einem AESV4-Dokument ist einzeln authentifiziert, doch die Querverweistabelle, die Objektnummerierung und der Trailer sind Struktur, kein verschlüsselter Inhalt. Ein Angreifer kann keinen Stream fälschen, aber nichts in der Chiffre allein hindert ihn daran, umzuordnen, worauf das Dokument verweist, oder Objekte aus einer früheren Revision derselben Datei einzuspleißen
Das eigenständige PDF-MAC-Token adressiert diese Schicht. PDFiumPas leitet es aus dem Dateiverschlüsselungsschlüssel mit einem dedizierten, 32 Byte großen /KDFSalt ab, der im Encrypt-Dictionary erfasst wird, sodass der Besitz des Passworts es einem Reader erlaubt, das Token zu bestätigen. Das Ergebnis ist eine einzige Antwort auf eine einzige Frage: Ist dieses Dokument als Ganzes das Dokument, das geschrieben wurde
var
Pdf: TPdf;
Mac: TPdfMacValidationResult;
begin
Pdf := TPdf.Create(nil);
try
Pdf.Password := 'open-secret';
Pdf.FileName := 'quarterly-report.enc.pdf';
Pdf.LoadDocument;
Mac := Pdf.ValidatePdfMac('open-secret');
case Mac.Status of
pmvsValid: ProcessDocument(Pdf);
pmvsNotPresent: ProcessWithWarning(Pdf); // kein Token in dieser Datei
pmvsInvalid: Quarantine(Mac.MessageText); // manipuliert oder abgeschnitten
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
Die vier Statuswerte brauchen vier unterschiedliche Reaktionen, und sie zu einem Boolean zusammenzufassen kostet genau die Unterscheidung, die zählt. pmvsNotPresent bedeutet, dass die Datei schlicht kein Token hat, was auf fast jedes vor 2024 geschriebene verschlüsselte PDF zutrifft und kein Beweis für irgendetwas ist. pmvsInvalid bedeutet, dass ein Token vorhanden ist und nicht verifiziert, ein echter Befund, der die Verarbeitung stoppen sollte. pmvsUnsupported bedeutet, dass das Token in einer Form existiert, die dieser Build nicht implementiert, eine Kompatibilitätslücke, kein Angriff. "Nicht vorhanden" wie "ungültig" zu behandeln würde den gesamten Altbestand am ersten Tag unter Quarantäne stellen
Was Verschlüsselung immer noch nicht leistet
Berechtigungs-Flags bleiben, was sie immer waren: eine Bitte an konforme Software, keine Kontrolle. Die /P-Bits aus ISO 32000-1 Tabelle 22, die Drucken oder Extraktion untersagen, werden von wohlerzogenen Viewern respektiert und von allem anderen ignoriert, und wer das Benutzerpasswort besitzt, hält bereits den entschlüsselten Inhalt. Verschlüsselung ist die Grenze; Berechtigungen beschreiben Absicht innerhalb dieser Grenze
Zwei betriebliche Details sind es wert, eingeplant zu werden. Erstens interagieren Verschlüsselung und spätere Änderung: Das Anhängen eines inkrementellen Updates an ein verschlüsseltes Dokument hat eigene Regeln, behandelt in inkrementellen Updates an verschlüsselten PDFs, und ein MAC-Token ist eine Aussage auf Dokumentebene, die ein unachtsames Anhängen ungültig macht. Zweitens verwendet die GCM-Konstruktion einen deterministischen IV-Zähler, und PDFiumPas löst eine Ausnahme aus, statt einen Zählerwert wiederzuverwenden, falls dieser Raum jemals erschöpft wäre, weil Nonce-Wiederverwendung bei GCM auf eine Weise katastrophal ist, die ein stiller Überlauf verbergen würde
Die Wahl zwischen den drei Revisionen in der Praxis
Notieren Sie, wer die Datei öffnet, dann entscheiden Sie. Für interne Verteilung, bei der jeder Leser ein aktueller, selbst kontrollierter Viewer ist, ist R7 mit Integritätsschutz die stärkste verfügbare Option, und es gibt keinen Grund, sie nicht zu verwenden. Für Dokumente, die die Organisation verlassen, ist R6 die vertretbare Vorgabe: standardisiert in ISO 32000-2 statt in einer technischen Spezifikation darüber, mit breiter Unterstützung. Für Archive und Alt-Konsumenten ist R5 die einzige Wahl, die zuverlässig öffnet, und Sie sollten notieren, warum, am selben Ort, an dem der Rest Ihrer Aufbewahrungsrichtlinie steht
Was auch immer Sie wählen, verifizieren Sie die Ausgabe, statt darauf zu vertrauen, dass der Aufruf erfolgreich war. Öffnen Sie die verschlüsselte Datei erneut, prüfen Sie ValidatePdfMac, und bestätigen Sie, dass die deklarierte Version die erwartete ist, mit den Versionskonformitätsprüfungen in exakter PDF-Versionskonformität. Eine breitere Checkliste für den Empfang nicht vertrauenswürdiger Dokumente steht in Prüfen von PDF-Sicherheitsrisiken
PDFiumPas ist eine Delphi- und Lazarus-Komponente rund um die PDFium-Engine mit dem PDF-2.0-Verschlüsselungsstack nativ in Pascal implementiert, sodass AES-256, GCM und das MAC-Token keine externe Krypto-DLL brauchen. Die Verschlüsselungs-API ist auf der PDFium Delphi-Komponente-Seite dokumentiert