TPdfEncryptionRevision = (erR5, erR6, erR7);
TPdfEncryptOptions = record
UserPassword: AnsiString;
OwnerPassword: AnsiString;
Permissions: Cardinal;
EncryptMetadata: Boolean;
Revision: TPdfEncryptionRevision;
EnableIntegrityProtection: Boolean;
class function Default: TPdfEncryptOptions; static;
end;
TPdfEncryptionKeys = record
FileEncryptionKey: TBytes;
OEntry: TBytes;
UEntry: TBytes;
OEEntry: TBytes;
UEEntry: TBytes;
PermsEntry: TBytes;
KdfSalt: TBytes;
end;
TPdfIncrementalEncryptionContext = record
FileEncryptionKey: TBytes;
KdfSalt: TBytes;
Revision: TPdfEncryptionRevision;
EncryptMetadata: Boolean;
EncryptObjectNumber: Integer;
EncryptGeneration: Integer;
HasAuthenticationCode: Boolean;
end;
procedure DeriveEncryptionKeys(const Options: TPdfEncryptOptions;
out Keys: TPdfEncryptionKeys);
function BuildEncryptDictionary(const Keys: TPdfEncryptionKeys;
const Options: TPdfEncryptOptions): AnsiString;
function EncryptStreamPayload(const FileKey: TBytes;
const Plain: TBytes): TBytes;
function EncryptDocumentBytes(const PlainPdf: TBytes;
const Options: TPdfEncryptOptions): TBytes;
function DecryptAesGcmDocumentBytes(const EncryptedPdf: TBytes;
const Password: AnsiString; out PlainPdf: TBytes;
out ErrorText: string): Boolean;
function ValidateEncryptedDocumentMac(const EncryptedPdf: TBytes;
const Password: AnsiString): TPdfMacValidationResult;
function ReadIncrementalEncryptionContext(const EncryptedPdf: TBytes;
const Password: AnsiString;
out Context: TPdfIncrementalEncryptionContext;
out ErrorText: string): Boolean;
procedure ClearIncrementalEncryptionContext(
var Context: TPdfIncrementalEncryptionContext);
function EncryptIncrementalObjectBody(const PlainBody: TBytes;
const Context: TPdfIncrementalEncryptionContext;
out EncryptedBody: TBytes;
out ErrorText: string): Boolean;
FPdfEncrypt implementuje bezpečnostní obslužný objekt PDF AES-256 definovaný v sekci 7.6 ISO 32000-2 a rozšíření AESV4-GCM definované ISO/TS 32003. EncryptDocumentBytes promění nešifrované pole bajtů PDF v zašifrovaný dokument pomocí vybrané revize
DeriveEncryptionKeys provádí derivaci klíčů založenou na hesle, která produkuje 32bajtový klíč šifrování souboru plus položky slovníku /O, /U, /OE, /UE a /Perms. BuildEncryptDictionary serializuje tyto položky do textu slovníku /Encrypt. EncryptStreamPayload aplikuje šifrování AES-256-CBC na jeden proud objektu pomocí klíče souboru
Pokročilý uživatel budující vlastní pipeline ukládání může volat tři primitiva přímo; aplikační kód normálně používá TPdf.SaveAsEncrypted nebo TPdf.SaveAsEncryptedToStream, které interně volají EncryptDocumentBytes
Když je EnableIntegrityProtection true, zapisovač vydá samostatný autentizační kód PDF 2.0 podle ISO/TS 32004 s /ByteRange pokrývajícím přesně EOF, /KDFSalt, CMS AuthenticatedData, HKDF-SHA256, AES-256 Key Wrap a HMAC-SHA256
PDFium aktuálně nevystavuje parsování AESV4 přes své public ABI. Zavolejte nejdřív DecryptAesGcmDocumentBytes a vraťené bajty předejte do TPdf.LoadDocument; funkce po selhání hesla, oprávnění, PDF MAC, tagu řetězce nebo tagu proudu nevrací žádný částečný prostý text
ReadIncrementalEncryptionContext autentizuje aktuální zašifrovaný řetězec revizí a obnoví zděděný bezpečnostní stav. EncryptIncrementalObjectBody zašifruje řetězce a payload proudu v jednom změněném nepřímém objektu, přičemž zachová výjimky metadat a aktualizuje přímé hodnoty /Length; ClearIncrementalEncryptionContext vymaže obnovený materiál klíčů
| Function | Description |
|---|---|
DeriveEncryptionKeys | Provede derivaci klíčů založenou na hesle a vrátí klíč souboru a pět položek slovníku |
BuildEncryptDictionary | Serializuje klíče a volby do textu slovníku /Encrypt |
EncryptStreamPayload | Zašifruje jeden proud objektu pomocí AES-256-CBC s klíčem souboru |
EncryptDocumentBytes | Jednorázový pomocník, který derivuje klíče, přepíše proudy a vloží slovník /Encrypt do celého pole bajtů PDF |
DecryptAesGcmDocumentBytes | Autentizuje a dešifruje výstup AESV4-GCM do bajtů prostého textu, které dokáže PDFium načíst |
ValidateEncryptedDocumentMac | Zvaliduje samostatný PDF MAC proti původním zašifrovaným bajtům pomocí uživatelského nebo vlastnického hesla |
ReadIncrementalEncryptionContext | Autentizuje zašifrovaný řetězec revizí a obnoví zděděný klíč souboru, revizi, politiku metadat, odkaz /Encrypt a stav PDF MAC |
ClearIncrementalEncryptionContext | Bezpečně vymaže obnovený materiál inkrementálních šifrovacích klíčů |
EncryptIncrementalObjectBody | Zašifruje řetězce a proudy v jednom změněném těle nepřímého objektu pod zděděným bezpečnostním kontextem |
| Type | Description |
|---|---|
TPdfEncryptionRevision | Výčet vybírající revizi AESV3-CBC erR5 nebo erR6, nebo revizi AESV4-GCM podle ISO/TS 32003 erR7 |
TPdfEncryptOptions | Záznam nesoucí hesla, příznaky oprávnění, politiku metadat, revizi bezpečnostního obslužného objektu a volitelnou ochranu integrity PDF MAC |
TPdfEncryptionKeys | Záznam držící klíč souboru, položky bezpečnostního obslužného objektu a volitelný 32bajtový /KDFSalt |
TPdfIncrementalEncryptionContext | Autentizovaný zděděný bezpečnostní stav používaný k připojování šifrovaných nepřímých objektů bez nahrazení stávajícího slovníku /Encrypt |
TPdfMacValidationStatus | pmvsValid, pmvsNotPresent, pmvsInvalid nebo pmvsUnsupported |
TPdfMacValidationResult | Validační Status samostatného PDF MAC a diagnostický MessageText |
DecryptAesGcmDocumentBytes následuje klasické řetězce revizí /Prev vydávané inkrementálním šifrovaným zapisovačem a vyřeší nejnovější aktivní generaci objektu; nativní načítání AESV4 v PDFium a externí vstup AESV4 přes xref-stream nejsou v tomto vydání dostupnéPermissions používá bitové rozložení z Tabulky 22 ISO 32000-1 (příznaky /P)