Teknisk artikkel

PDF 2.0 AES-GCM-kryptering i Delphi: ISO/TS 32003

PDFiumPas skriver ISO/TS 32003-kryptering gjennom SaveAsEncrypted: sett Revision til erR7, og hver streng og strøm beskyttes med AES-256 i GCM-modus, den autentiserte chifferen PDF 2.0 fikk i 2023. Sett også EnableIntegrityProtection, og dokumentet bærer også et frittstående PDF MAC-token, som ValidatePdfMac sjekker på lesesiden

Dette er to forskjellige beskyttelser folk rutinemessig blander sammen. GCM autentiserer hver krypterte verdi. MAC-en autentiserer dokumentet som helhet. Du vil ha begge, av ulike grunner

Hva gir GCM som CBC aldri leverte?

Autentisering av chifferteksten. AES-256 i CBC-modus, AESV3-skjemaet i ISO 32000-2, holder innholdet konfidensielt og sier ingenting om hvorvidt det ankom uendret. CBC er formbar på spesifikke, velstuderte måter: en angriper som kan vende bit i chifferteksten, produserer forutsigbare endringer i klarteksten til den påfølgende blokken, og ingenting i formatet legger merke til det

GCM lukker det hullet. Hver krypterte verdi bærer en 16-byte autentiseringstagg, fullstendig serialisert slik ISO/TS 32003 krever, og dekryptering feiler fremfor å returnere endret klartekst når taggen ikke stemmer. I PDF-termer er en tuklet streng eller strøm i et AESV4-dokument en hard feil på bruksstedet, ikke en merkelig verdi som forplanter seg inn i applikasjonen din. Encrypt-ordboken markerer dette med /CFM /AESV4 og V 6 / R 7, sammen med en utvidelsesoppføring som erklærer /ExtensionLevel 32003 og /ExtensionRevision (:2023)

Tre revisjoner, tre økosystemer

TPdfEncryptionRevision tilbyr erR5, erR6 og erR7, og valget er mer en kompatibilitetsbeslutning enn en kryptografisk en. R5 er det opprinnelige AES-256-skjemaet publisert som en PDF 1.7-utvidelse, med en enkelt SHA-256-passordhash, og det åpnes i så godt som alt fra de siste femten årene. R6 er den herdede nøkkelutledningen standardisert i ISO 32000-2, som bruker den itererende SHA-256/384/512-konstruksjonen fra algoritme 2.B, og det er det en gjeldende PDF 2.0- eller PDF/A-4-arbeidsflyt forventer. R7 er ISO/TS 32003, som bruker den samme 2.B-utledningen med AES-GCM som chifferen

Leserstøtte følger nøyaktig den rekkefølgen, og R7-støtte er fortsatt tynn utenfor dagens mest brukte visere. Dette er samme avveining som styrer enhver PDF 2.0-funksjon: det nyeste alternativet er den beste ingeniørkunsten og det smaleste publikummet. Bestem ut fra hvem som skal åpne filen, og hvis svaret er «et arkivsystem ingen har oppdatert siden 2019», er svaret R5 uansett hva sikkerhetspolicyen foretrekker

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;   // frittstående PDF MAC-token

    if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
      raise Exception.Create('Encrypted save failed');
  finally
    Pdf.Free;
  end;
end;

Hvorfor en dokument-MAC på toppen av en autentisert chiffer?

Fordi GCM-tagger beskytter verdiene, ikke arrangementet av verdiene. Hver streng og strøm i et AESV4-dokument er individuelt autentisert, men kryssreferansetabellen, objektnummereringen og avslutningen er struktur, ikke kryptert innhold. En angriper kan ikke forfalske en strøm, men ingenting i chifferen alene hindrer dem i å omorganisere hvilke objekter dokumentet peker på, eller splice inn objekter fra en tidligere revisjon av samme fil

Det frittstående PDF MAC-tokenet adresserer det laget. PDFiumPas utleder det fra filkrypteringsnøkkelen med en dedikert 32-byte /KDFSalt registrert i Encrypt-ordboken, slik at det er besittelse av passordet som lar en leser bekrefte tokenet. Resultatet er ett enkelt svar på ett enkelt spørsmål: er dette dokumentet, som helhet, dokumentet som ble skrevet

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);       // no token in this file
      pmvsInvalid:     Quarantine(Mac.MessageText);   // tampered or truncated
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

De fire statusverdiene trenger fire forskjellige responser, og å slå dem sammen til en boolsk verdi mister skillet som betyr noe. pmvsNotPresent betyr at filen rett og slett ikke har noe token, noe som beskriver nesten hver eneste krypterte PDF skrevet før 2024, og er ikke bevis på noe som helst. pmvsInvalid betyr at et token er til stede og ikke verifiserer, som er et reelt funn og bør stoppe prosesseringen. pmvsUnsupported betyr at tokenet finnes i en form dette bygget ikke implementerer, som er et kompatibilitetsgap, ikke et angrep. Å behandle «ikke til stede» som «ugyldig» ville satt hele det gamle arkivet ditt i karantene på dag én

Hva kryptering fortsatt ikke gjør

Tillatelsesflagg forblir det de alltid har vært: en forespørsel til konform programvare, ikke en kontroll. /P-bitene fra ISO 32000-1 tabell 22 som forbyr utskrift eller uttrekking, respekteres av veloppdragne visere og ignoreres av alt annet, og alle som har brukerpassordet, har allerede det dekrypterte innholdet. Kryptering er grensen; tillatelser beskriver intensjonen innenfor den

To driftsdetaljer er verdt å planlegge for. Først, kryptering og senere endring samvirker: å legge til en inkrementell oppdatering på et kryptert dokument har sine egne regler, dekket i inkrementelle oppdateringer på krypterte PDF-er, og et MAC-token er en påstand på dokumentnivå som en uforsiktig tillegging vil ugyldiggjøre. Deretter, GCM-konstruksjonen bruker en deterministisk IV-teller, og PDFiumPas kaster et unntak fremfor å gjenbruke en tellerverdi hvis det rommet noen gang ble uttømt, fordi gjenbruk av nonce i GCM er katastrofalt på en måte en stille rundgang ville skjult

Å velge mellom de tre revisjonene i praksis

Skriv ned hvem som skal åpne filen, og velg deretter. For intern distribusjon der hver leser er en gjeldende viser under din kontroll, er R7 med integritetsbeskyttelse det sterkeste tilgjengelige alternativet, og det er ingen grunn til å ikke bruke det. For dokumenter som forlater organisasjonen, er R6 det forsvarlige standardvalget: det er standardisert i ISO 32000-2 fremfor i en teknisk spesifikasjon på toppen av den, og støtten er bred. For arkiver og gamle konsumenter er R5 det eneste valget som pålitelig åpnes, og du bør notere hvorfor på samme sted du noterer resten av oppbevaringspolicyen din

Uansett hva du velger, verifiser utdataen fremfor å stole på at kallet lyktes. Åpne den krypterte filen på nytt, sjekk ValidatePdfMac, og bekreft at den erklærte versjonen er det du forventer, ved å bruke versjonskonformitetssjekkene i eksakt PDF-versjonskonformitet. En bredere mottakssjekkliste for utiltrodde dokumenter finnes i revisjon av PDF-sikkerhetsrisikoer

PDFiumPas er en komponent for Delphi og Lazarus bygget rundt PDFium-motoren, med PDF 2.0-krypteringsstakken implementert nativt i Pascal, slik at AES-256, GCM og MAC-tokenet ikke trenger noen ekstern krypto-DLL. Krypterings-API-et er dokumentert på PDFium sin side for Delphi-komponent