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 реализует обработчик безопасности 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 очищает восстановленный ключевой материал
| Function | Description |
|---|---|
DeriveEncryptionKeys | Выполняет вывод ключей на основе пароля и возвращает ключ файла и пять записей словаря |
BuildEncryptDictionary | Сериализует ключи и опции в текст словаря /Encrypt |
EncryptStreamPayload | Шифрует один поток объекта с AES-256-CBC, используя ключ файла |
EncryptDocumentBytes | Одноразовый помощник, который вычисляет ключи, переписывает потоки и вставляет словарь /Encrypt в целый массив байтов PDF |
DecryptAesGcmDocumentBytes | Аутентифицирует и расшифровывает вывод AESV4-GCM в байты открытого текста, которые может загрузить PDFium |
ValidateEncryptedDocumentMac | Проверяет автономный PDF MAC по исходным зашифрованным байтам, используя пароль пользователя или владельца |
ReadIncrementalEncryptionContext | Аутентифицирует цепочку зашифрованных ревизий и восстанавливает унаследованные ключ файла, ревизию, политику метаданных, ссылку /Encrypt и состояние PDF MAC |
ClearIncrementalEncryptionContext | Безопасно очищает восстановленный ключевой материал инкрементного шифрования |
EncryptIncrementalObjectBody | Шифрует строки и потоки в теле одного изменённого косвенного объекта в унаследованном контексте безопасности |
| Type | Description |
|---|---|
TPdfEncryptionRevision | Перечисление, выбирающее ревизию AESV3-CBC erR5 или erR6 либо ревизию AESV4-GCM из ISO/TS 32003 erR7 |
TPdfEncryptOptions | Запись с паролями, флагами разрешений, политикой метаданных, ревизией обработчика безопасности и необязательной защитой целостности PDF MAC |
TPdfEncryptionKeys | Запись с ключом файла, записями обработчика безопасности и необязательным 32-байтовым /KDFSalt |
TPdfIncrementalEncryptionContext | Аутентифицированное унаследованное состояние безопасности, используемое для дописывания зашифрованных косвенных объектов без замены существующего словаря /Encrypt |
TPdfMacValidationStatus | pmvsValid, pmvsNotPresent, pmvsInvalid или pmvsUnsupported |
TPdfMacValidationResult | Статус Status проверки автономного PDF MAC и диагностический MessageText |
DecryptAesGcmDocumentBytes идёт по классическим цепочкам ревизий /Prev, создаваемым писателем зашифрованных инкрементов, и разрешает новейшее активное поколение объекта; нативная загрузка AESV4 в PDFium и внешний ввод AESV4 через xref-stream в этом выпуске недоступныPermissions использует битовую раскладку таблицы 22 ISO 32000-1 (флаги /P)