In de juridische, financiële en gezondheidszorgsector is het genereren van grote hoeveelheden PDF-documenten de standaardpraktijk. Het produceren van de documenten is echter slechts de helft van het werk; het beveiligen ervan is net zo belangrijk. Wanneer u een archiveringspijplijn heeft die dagelijks honderden gigabytes aan PDF's verwerkt, kan het toepassen van AES-256 versleuteling snel een prestatieknelpunt worden.
In dit artikel onderzoeken we hoe u snelle AES-256 PDF-versleuteling in Delphi kunt bereiken door geheugenuitputting te vermijden en de cryptografische lussen te optimaliseren.
De PDF-versleutelingsspecificatie
PDF-beveiliging is aanzienlijk geëvolueerd. Vroege versies gebruikten 40-bit RC4, dat tegenwoordig triviaal te kraken is. De huidige standaard (PDF 1.7 Extension Level 3 en PDF 2.0) vereist AES-256 versleuteling.
In een PDF versleutelt u niet het hele bestandsblok. De documentstructuur (de XRef-tabel en de structuur van dictionaries) blijft in platte tekst. In plaats daarvan versleutelt u de Streams (de onbewerkte gegevens voor afbeeldingen en pagina-inhoud) en Strings (zoals metadatatekst). Dit vereist dat de parser de gegevens extraheert, AES CBC (Cipher Block Chaining) toepast en deze terugschrijft.
Het knelpunt: Laden naar het geheugen
Een veelgemaakte fout bij het versleutelen van een enorme PDF (bijv. een gescand archief van 2 GB) is het laden van de volledige stream in een TMemoryStream voordat deze aan de cryptografische engine wordt doorgegeven. Dit leidt tot Out-Of-Memory (OOM) uitzonderingen in 32-bit processen en massale page faulting in 64-bit processen.
Streaming-versleuteling in Delphi
De oplossing is om een opgedeelde (chunked), streaming-aanpak te gebruiken. Met behulp van de Windows Cryptography API: Next Generation (CNG) of een bibliotheek zoals OpenSSL, kunt u de PDF-stream in blokken van 64 KB lezen, het blok versleutelen en het rechtstreeks naar de uitvoerschijfstream schrijven.
Hier is een conceptueel Delphi-voorbeeld dat een gebufferde versleutelingslus voor een stream demonstreert:
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;
De cryptografische backend optimaliseren
Delphi-ontwikkelaars hebben verschillende keuzes voor de AES-backend:
- Native Delphi-implementaties: Eenvoudig te implementeren, maar vaak langzamer omdat ze puur in software worden uitgevoerd.
- Windows CNG (BCrypt): Zeer geoptimaliseerd en kan hardwareversnelling gebruiken (AES-NI-instructies op moderne Intel/AMD-CPU's).
- OpenSSL (libcrypto): De industriestandaard, ongelooflijk snel, maar vereist het meeleveren van externe DLL's.
Voor serverapplicaties met een hoge doorvoer is hardware-versnelde AES-NI verplicht. Wanneer u Windows CNG in Delphi gebruikt, stelt het in kaart brengen van de BCryptEncrypt-functie uw applicatie in staat om het zware werk over te hevelen naar de specifieke cryptografische silicium van de CPU, waardoor de versleutelingsoverhead effectief tot bijna nul wordt gereduceerd.
Conclusie
Wanneer u PDF's op gigabyteschaal versleutelt, vertrouw dan op stream chunking in plaats van volledige geheugenbuffering, en zorg ervoor dat uw cryptografische backend gebruikmaakt van hardwarematige AES-NI-versnelling. Deze combinatie garandeert dat uw archiveringspijplijn draait op de snelheid van uw NVMe-schijven, in plaats van beperkt te worden door de CPU.
Opmerking: Snelle AES-256 versleuteling met behulp van chunked streaming wordt native ondersteund in de HotPDF VCL Component.