PDFium Delphi Component Docs

FPdfEncrypt ユニット

ユニット: FPdfEncrypt
AES-256 暗号化キーを導出し、ISO 32000-2 AESV3-CBC または ISO/TS 32003 AESV4-GCM の文字列、ストリーム、暗号化辞書を生成します

構文

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 は、ISO 32000-2 の 7.6 節で定義される PDF AES-256 セキュリティハンドラと、ISO/TS 32003 で定義される AESV4-GCM 拡張を実装します。EncryptDocumentBytes は平文の PDF バイト配列を選択されたリビジョンで暗号化されたドキュメントへ変換します

DeriveEncryptionKeys はパスワードベースの鍵導出を実行し、32 バイトのファイル暗号化キーと /O/U/OE/UE/Perms の各辞書エントリを生成します。BuildEncryptDictionary はこれらのエントリを /Encrypt 辞書テキストへシリアライズします。EncryptStreamPayload はファイルキーを使って 1 つのオブジェクトストリームに AES-256-CBC 暗号化を適用します

カスタム保存パイプラインを構築するパワーユーザーは 3 つのプリミティブを直接呼び出せます。アプリケーションコードは通常、内部で EncryptDocumentBytes を呼び出す TPdf.SaveAsEncrypted または TPdf.SaveAsEncryptedToStream を使用します

EnableIntegrityProtection が true の場合、ライターは正確に EOF をカバーする /ByteRange/KDFSalt、CMS AuthenticatedData、HKDF-SHA256、AES-256 Key Wrap、HMAC-SHA256 を備えた PDF 2.0 の ISO/TS 32004 スタンドアロン認証コードを生成します

PDFium は現在、public ABI を通じて AESV4 の解析を公開していません。最初に DecryptAesGcmDocumentBytes を呼び出し、返されたバイトを TPdf.LoadDocument に渡してください。この関数は、パスワード、アクセス許可、PDF MAC、文字列タグ、ストリームタグのいずれかの失敗後に部分的な平文を返しません

ReadIncrementalEncryptionContext は現在の暗号化リビジョンチェーンを認証し、引き継がれたセキュリティ状態を復元します。EncryptIncrementalObjectBody はメタデータ除外を保持し、直接の /Length 値を更新しながら、変更された 1 つの間接オブジェクト内の文字列とストリームペイロードを暗号化します。ClearIncrementalEncryptionContext は復元された鍵素材をクリアします

関数

関数説明
DeriveEncryptionKeysパスワードベースの鍵導出を実行し、ファイルキーと 5 つの辞書エントリを返します
BuildEncryptDictionaryキーとオプションを /Encrypt 辞書テキストへシリアライズします
EncryptStreamPayloadファイルキーを使って 1 つのオブジェクトストリームを AES-256-CBC で暗号化します
EncryptDocumentBytes鍵導出、ストリーム書き換え、PDF 全体のバイト配列への /Encrypt 辞書注入を 1 回で行うヘルパーです
DecryptAesGcmDocumentBytesAESV4-GCM 出力を認証して復号し、PDFium が読み込める平文バイトを生成します
ValidateEncryptedDocumentMacスタンドアロンの PDF MAC を、ユーザーまたはオーナーのパスワードで元の暗号化バイトに対して検証します
ReadIncrementalEncryptionContext暗号化されたリビジョンチェーンを認証し、引き継がれたファイルキー、リビジョン、メタデータポリシー、/Encrypt 参照、PDF MAC 状態を復元します
ClearIncrementalEncryptionContext復元されたインクリメンタル暗号化の鍵素材を安全にクリアします
EncryptIncrementalObjectBody引き継いだセキュリティコンテキストの下で、変更された 1 つの間接オブジェクト本体の中の文字列とストリームを暗号化します

説明
TPdfEncryptionRevisionAESV3-CBC リビジョン erR5 または erR6、あるいは ISO/TS 32003 AESV4-GCM リビジョン erR7 を選択する列挙型です
TPdfEncryptOptionsパスワード、アクセス許可フラグ、メタデータポリシー、セキュリティハンドラリビジョン、オプションの PDF MAC 完全性保護を運ぶレコードです
TPdfEncryptionKeysファイルキー、セキュリティハンドラエントリ、オプションの 32 バイト /KDFSalt を保持するレコードです
TPdfIncrementalEncryptionContext既存の /Encrypt 辞書を置き換えずに暗号化された間接オブジェクトを追記するために使われる、認証済みの引き継ぎセキュリティ状態です
TPdfMacValidationStatuspmvsValidpmvsNotPresentpmvsInvalidpmvsUnsupported
TPdfMacValidationResultスタンドアロン PDF MAC 検証の Status と診断 MessageText です

備考

関連項目

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