Im Rechts-, Finanz- und Gesundheitswesen ist die Erstellung großer Mengen von PDF-Dokumenten gängige Praxis. Die Erstellung der Dokumente ist jedoch nur die halbe Miete; ihre Absicherung ist ebenso wichtig. Wenn Sie über eine Archiv-Pipeline verfügen, die täglich Hunderte von Gigabyte an PDFs verarbeitet, kann die Anwendung der AES-256-Verschlüsselung schnell zu einem Leistungsengpass werden.
In diesem Artikel untersuchen wir, wie eine Hochgeschwindigkeits-AES-256-PDF-Verschlüsselung in Delphi erreicht werden kann, indem eine Erschöpfung des Arbeitsspeichers vermieden und die kryptografischen Schleifen optimiert werden.
Die PDF-Verschlüsselungsspezifikation
Die PDF-Sicherheit hat sich erheblich weiterentwickelt. Frühe Versionen verwendeten 40-Bit-RC4, das heute trivial zu knacken ist. Der aktuelle Standard (PDF 1.7 Extension Level 3 und PDF 2.0) schreibt eine AES-256-Verschlüsselung vor.
In einem PDF verschlüsseln Sie nicht den gesamten Dateiblock. Die Dokumentstruktur (die XRef-Tabelle und die Struktur von Wörterbüchern) bleibt im Klartext. Stattdessen verschlüsseln Sie die Streams (die Rohdaten für Bilder und Seiteninhalte) und Strings (wie Metadatentext). Dies erfordert, dass der Parser die Daten extrahiert, AES CBC (Cipher Block Chaining) anwendet und sie zurückschreibt.
Der Engpass: Laden in den Speicher
Ein häufiger Fehler bei der Verschlüsselung eines massiven PDFs (z. B. eines 2-GB-gescannten Archivs) ist das Laden des gesamten Streams in einen TMemoryStream, bevor er an die kryptografische Engine übergeben wird. Dies führt zu Out-Of-Memory (OOM)-Ausnahmen in 32-Bit-Prozessen und massiven Seitenfehlern in 64-Bit-Prozessen.
Streaming-Verschlüsselung in Delphi
Die Lösung besteht in der Verwendung eines blockbasierten Streaming-Ansatzes. Mit der Windows Cryptography API: Next Generation (CNG) oder einer Bibliothek wie OpenSSL können Sie den PDF-Stream in 64-KB-Blöcken lesen, den Block verschlüsseln und ihn direkt in den Ausgabe-Disk-Stream schreiben.
Hier ist ein konzeptionelles Delphi-Beispiel, das eine gepufferte Verschlüsselungsschleife für einen Stream demonstriert:
uses
System.Classes, System.SysUtils;
const
BUFFER_SIZE = 65536; // 64KB chunks
// This represents your AES-256 encryption routine
procedure EncryptStreamChunk(const InBuffer; var OutBuffer; BytesRead: Integer; const Key: TBytes; const IV: TBytes);
begin
// Call to Windows CNG (BCryptEncrypt) or OpenSSL (EVP_EncryptUpdate)
// ...
end;
procedure EncryptLargePDFStream(InputStream, OutputStream: TStream; const Key, IV: TBytes);
var
InBuffer, OutBuffer: array of Byte;
BytesRead: Integer;
begin
SetLength(InBuffer, BUFFER_SIZE);
// AES CBC requires padding, so the output buffer must be slightly larger
SetLength(OutBuffer, BUFFER_SIZE + 16);
InputStream.Position := 0;
OutputStream.Position := 0;
repeat
BytesRead := InputStream.Read(InBuffer[0], BUFFER_SIZE);
if BytesRead > 0 then
begin
EncryptStreamChunk(InBuffer[0], OutBuffer[0], BytesRead, Key, IV);
// Write the encrypted cipher text directly to disk
OutputStream.Write(OutBuffer[0], BytesRead); // Note: padding logic omitted for brevity
end;
until BytesRead < BUFFER_SIZE;
end;
Optimierung des kryptografischen Backends
Delphi-Entwicklern stehen mehrere Optionen für das AES-Backend zur Auswahl:
- Native Delphi-Implementierungen: Einfach bereitzustellen, aber oft langsamer, da sie rein in Software ausgeführt werden.
- Windows CNG (BCrypt): Hochgradig optimiert und kann Hardwarebeschleunigung nutzen (AES-NI-Anweisungen auf modernen Intel-/AMD-CPUs).
- OpenSSL (libcrypto): Der Industriestandard, unglaublich schnell, erfordert jedoch die Auslieferung externer DLLs.
Für Serveranwendungen mit hohem Durchsatz ist hardwarebeschleunigtes AES-NI obligatorisch. Wenn Sie Windows CNG in Delphi verwenden, können Sie durch das Zuordnen der Funktion BCryptEncrypt die schwere Arbeit an das dedizierte kryptografische Silizium der CPU auslagern und so den Verschlüsselungsaufwand effektiv auf nahezu null reduzieren.
Fazit
Verlassen Sie sich beim Verschlüsseln von PDFs im Gigabyte-Maßstab auf Stream-Chunking anstelle von voller Speicherpufferung und stellen Sie sicher, dass Ihr kryptografisches Backend die AES-NI-Hardwarebeschleunigung nutzt. Diese Kombination garantiert, dass Ihre Archivierungs-Pipeline mit der Geschwindigkeit Ihrer NVMe-Laufwerke läuft und nicht CPU-gebunden ist.
Hinweis: Hochgeschwindigkeits-AES-256-Verschlüsselung mit Chunked-Streaming wird in der HotPDF VCL-Komponente nativ unterstützt.