Technical Article

Nopea AES-256-PDF-salaus massiivisille asiakirjoille

Laki-, rahoitus- ja terveydenhuoltoaloilla suurten PDF-asiakirjamäärien luominen on vakiokäytäntö. Asiakirjojen tuottaminen on kuitenkin vain puolet taistelusta; niiden turvaaminen on yhtä kriittistä. Kun sinulla on arkistoputki, joka käsittelee satoja gigatavuja PDF-tiedostoja päivittäin, AES-256-salauksen soveltamisesta voi nopeasti tulla suorituskyvyn pullonkaula.

Tässä artikkelissa tutkimme, kuinka saavuttaa nopea AES-256-PDF-salaus Delphissä välttämällä muistin loppuminen ja optimoimalla kryptografiset silmukat.

PDF-salauksen määrittely

PDF-tietoturva on kehittynyt merkittävästi. Varhaiset versiot käyttivät 40-bittistä RC4-salausta, joka on nykyään triviaalisti murrettavissa. Nykyinen standardi (PDF 1.7 Extension Level 3 ja PDF 2.0) vaatii AES-256-salauksen.

PDF-tiedostossa ei salata koko tiedostolohkoa. Asiakirjan rakenne (XRef-taulukko ja sanakirjojen rakenne) pysyy selkokielisenä. Sen sijaan salaat virrat (Streams, kuvien ja sivusisällön raakadata) ja merkkijonot (Strings, kuten metatietoteksti). Tämä edellyttää, että jäsennin purkaa tiedot, soveltaa AES CBC -salausta (Cipher Block Chaining) ja kirjoittaa ne takaisin.

Pullonkaula: Muistiin lataaminen

Yleinen virhe salattaessa massiivista PDF-tiedostoa (esim. 2 Gt:n skannattu arkisto) on ladata koko virta TMemoryStream-objektiin ennen sen välittämistä kryptografiselle moottorille. Tämä johtaa Out-Of-Memory (OOM) -poikkeuksiin 32-bittisissä prosesseissa ja massiiviseen sivutusvirheeseen (page faulting) 64-bittisissä prosesseissa.

Suoratoistosalaus Delphissä

Ratkaisu on käyttää palasteltua, suoratoistavaa lähestymistapaa. Käyttämällä Windows Cryptography API: Next Generationia (CNG) tai OpenSSL:n kaltaista kirjastoa voit lukea PDF-virran 64 kt:n lohkoissa, salata lohkon ja kirjoittaa sen suoraan tulostuslevyvirtaan.

Tässä on käsitteellinen Delphi-esimerkki, joka havainnollistaa puskuroidun salaussilmukan virralle:

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;

Kryptografisen taustajärjestelmän optimointi

Delphi-kehittäjillä on useita vaihtoehtoja AES-taustajärjestelmäksi:

  • Natiivit Delphi-toteutukset: Helppo ottaa käyttöön, mutta usein hitaampia, koska ne suoritetaan puhtaasti ohjelmistossa.
  • Windows CNG (BCrypt): Erittäin optimoitu ja voi hyödyntää laitteistokiihdytystä (AES-NI-käskyt nykyaikaisissa Intel/AMD-suorittimissa).
  • OpenSSL (libcrypto): Alan standardi, uskomattoman nopea, mutta vaatii ulkoisten DLL-tiedostojen toimittamisen.

Suuren läpimenon palvelinsovelluksissa laitteistokiihdytetty AES-NI on pakollinen. Kun käytetään Windows CNG:tä Delphissä, BCryptEncrypt-funktion yhdistäminen antaa sovelluksesi siirtää raskaan työn suorittimen omistetulle kryptografiselle piille, mikä vähentää salauksen yleiskustannukset tehokkaasti lähes nollaan.

Yhteenveto

Kun salaat gigatavuluokan PDF-tiedostoja, luota virran palasteluun täyden muistipuskuroinnin sijaan ja varmista, että kryptografinen taustajärjestelmäsi hyödyntää laitteiston AES-NI-kiihdytystä. Tämä yhdistelmä takaa, että arkistointiputkesi toimii NVMe-asemiesi nopeudella sen sijaan, että se olisi suoritinsidonnainen.

Huomautus: Nopea AES-256-salaus hyödyntäen palasteltua suoratoistoa on natiivisti tuettu HotPDF VCL -komponentissa.