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 або ревізію ISO/TS 32003 AESV4-GCM erR7 |
TPdfEncryptOptions | Запис із паролями, прапорцями дозволів, політикою метаданих, ревізією обробника безпеки та необов'язковим захистом цілісності PDF MAC |
TPdfEncryptionKeys | Запис із ключем файлу, записами обробника безпеки та необов'язковим 32-байтовим /KDFSalt |
TPdfIncrementalEncryptionContext | Автентифікований успадкований стан безпеки для дописування зашифрованих непрямих об'єктів без заміни наявного словника /Encrypt |
TPdfMacValidationStatus | pmvsValid, pmvsNotPresent, pmvsInvalid або pmvsUnsupported |
TPdfMacValidationResult | Статус Status перевірки окремого PDF MAC і діагностичний MessageText |
DecryptAesGcmDocumentBytes слідує класичним ланцюгам ревізій /Prev, які формує зашифрований інкрементальний записувач, і розв'язує найновіше активне покоління об'єкта; нативне завантаження PDFium AESV4 і зовнішній ввід AESV4 через xref-stream недоступні в цьому випускуPermissions використовує розкладку бітів ISO 32000-1 Table 22 (прапорці /P)