PDFium Delphi Component Docs

Модуль FPdfEncrypt

Модуль: FPdfEncrypt
Вычисляет ключи шифрования AES-256 и формирует строки, потоки и словари шифрования ISO 32000-2 AESV3-CBC или ISO/TS 32003 AESV4-GCM

Syntax

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;

Description

FPdfEncrypt реализует обработчик безопасности PDF AES-256, определённый в разделе 7.6 ISO 32000-2, и расширение AESV4-GCM, определённое в ISO/TS 32003. EncryptDocumentBytes превращает обычный массив байтов PDF в зашифрованный документ с выбранной ревизией

DeriveEncryptionKeys выполняет вывод ключей на основе пароля, который даёт 32-байтовый ключ шифрования файла плюс записи словаря /O, /U, /OE, /UE и /Perms. BuildEncryptDictionary сериализует эти записи в текст словаря /Encrypt. EncryptStreamPayload применяет шифрование AES-256-CBC к одному потоку объекта, используя ключ файла

Опытный пользователь, собирающий собственный конвейер сохранения, может вызывать эти три примитива напрямую; код приложения обычно использует TPdf.SaveAsEncrypted или TPdf.SaveAsEncryptedToStream, которые внутри вызывают EncryptDocumentBytes

Когда EnableIntegrityProtection истинно, писатель выдаёт автономный код аутентификации PDF 2.0 ISO/TS 32004 с точным /ByteRange, покрывающим EOF, /KDFSalt, CMS AuthenticatedData, HKDF-SHA256, AES-256 Key Wrap и HMAC-SHA256

PDFium пока не открывает разбор AESV4 через свой публичный ABI. Сначала вызовите DecryptAesGcmDocumentBytes и передайте возвращённые байты в TPdf.LoadDocument; после сбоя пароля, разрешений, PDF MAC, тега строки или тега потока функция не возвращает частичный открытый текст

ReadIncrementalEncryptionContext аутентифицирует текущую цепочку зашифрованных ревизий и восстанавливает унаследованное состояние безопасности. EncryptIncrementalObjectBody шифрует строки и данные потока в одном изменённом косвенном объекте, сохраняя исключения метаданных и обновляя прямые значения /Length; ClearIncrementalEncryptionContext очищает восстановленный ключевой материал

Functions

FunctionDescription
DeriveEncryptionKeysВыполняет вывод ключей на основе пароля и возвращает ключ файла и пять записей словаря
BuildEncryptDictionaryСериализует ключи и опции в текст словаря /Encrypt
EncryptStreamPayloadШифрует один поток объекта с AES-256-CBC, используя ключ файла
EncryptDocumentBytesОдноразовый помощник, который вычисляет ключи, переписывает потоки и вставляет словарь /Encrypt в целый массив байтов PDF
DecryptAesGcmDocumentBytesАутентифицирует и расшифровывает вывод AESV4-GCM в байты открытого текста, которые может загрузить PDFium
ValidateEncryptedDocumentMacПроверяет автономный PDF MAC по исходным зашифрованным байтам, используя пароль пользователя или владельца
ReadIncrementalEncryptionContextАутентифицирует цепочку зашифрованных ревизий и восстанавливает унаследованные ключ файла, ревизию, политику метаданных, ссылку /Encrypt и состояние PDF MAC
ClearIncrementalEncryptionContextБезопасно очищает восстановленный ключевой материал инкрементного шифрования
EncryptIncrementalObjectBodyШифрует строки и потоки в теле одного изменённого косвенного объекта в унаследованном контексте безопасности

Types

TypeDescription
TPdfEncryptionRevisionПеречисление, выбирающее ревизию AESV3-CBC erR5 или erR6 либо ревизию AESV4-GCM из ISO/TS 32003 erR7
TPdfEncryptOptionsЗапись с паролями, флагами разрешений, политикой метаданных, ревизией обработчика безопасности и необязательной защитой целостности PDF MAC
TPdfEncryptionKeysЗапись с ключом файла, записями обработчика безопасности и необязательным 32-байтовым /KDFSalt
TPdfIncrementalEncryptionContextАутентифицированное унаследованное состояние безопасности, используемое для дописывания зашифрованных косвенных объектов без замены существующего словаря /Encrypt
TPdfMacValidationStatuspmvsValid, pmvsNotPresent, pmvsInvalid или pmvsUnsupported
TPdfMacValidationResultСтатус Status проверки автономного PDF MAC и диагностический MessageText

Remarks

See Also

FPdfAes, FPdfSha256, FPdfHmac, FPdfMac, TPdf.SaveAsEncrypted, TPdf.SaveAsEncryptedToStream