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 گردانندهٔ امنیتی AES-256 تعریفشده در بخش ۷٫۶ از ISO 32000-2 و افزونهٔ AESV4-GCM تعریفشده در ISO/TS 32003 را پیادهسازی میکند. EncryptDocumentBytes یک آرایهٔ بایتی PDF آشکار را با بازنگری منتخب به سندی رمزنگاریشده بدل میکند
DeriveEncryptionKeys مشتقسازی کلید مبتنی بر گذرواژه را اجرا میکند که کلید رمزگذاری فایل ۳۲ بایتی بهعلاوهٔ مدخلهای دیکشنری /O، /U، /OE، /UE و /Perms را تولید میکند. BuildEncryptDictionary این مدخلها را به متن دیکشنری /Encrypt سری میکند. EncryptStreamPayload رمزگذاری AES-256-CBC را با کلید فایل روی جریان یک شیء اعمال میکند
کاربر قدرتمندی که خط لولهٔ ذخیرهٔ سفارشی میسازد میتواند این سه ابتدایی را مستقیم صدا بزند؛ کد برنامه معمولاً از TPdf.SaveAsEncrypted یا TPdf.SaveAsEncryptedToStream استفاده میکند که درونشان EncryptDocumentBytes را صدا میزنند
وقتی EnableIntegrityProtection برابر true باشد، نویسنده یک کد احراز هویت مستقل از ISO/TS 32004 مختص PDF 2.0 با /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 | رکوردی حامل کلید فایل، مدخلهای گردانندهٔ امنیتی و /KDFSalt اختیاری ۳۲ بایتی |
TPdfIncrementalEncryptionContext | وضعیت امنیتی بهارثرسیدهٔ احراز هویتشده که برای افزودن اشیاء غیرمستقیم رمزنگاریشده بدون جایگزینی دیکشنری موجود /Encrypt به کار میرود |
TPdfMacValidationStatus | pmvsValid، pmvsNotPresent، pmvsInvalid یا pmvsUnsupported |
TPdfMacValidationResult | Status اعتبارسنجی PDF MAC مستقل و MessageText تشخیصی |
DecryptAesGcmDocumentBytes زنجیرههای بازنگری کلاسیک /Prev را که نویسندهٔ افزایشی رمزنگاریشده تولید میکند دنبال میکند و جدیدترین generation فعال شیء را حل میکند؛ بارگذاری بومی AESV4 در PDFium و ورودی AESV4 با xref-stream بیرونی در این نسخه در دسترس نیستندPermissions از چیدمان بیتی جدول ۲۲ در ISO 32000-1 (پرچمهای /P) استفاده میکند