Technical Article

Hochgeschwindigkeits-AES-256-PDF-Verschlüsselung für riesige Dokumente

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.