Artikel Teknis

Enkripsi AES-GCM PDF 2.0 di Delphi: ISO/TS 32003

PDFiumPas menulis enkripsi ISO/TS 32003 lewat SaveAsEncrypted: atur Revision ke erR7 dan setiap string serta stream dilindungi dengan AES-256 dalam mode GCM, cipher terautentikasi yang didapatkan PDF 2.0 pada tahun 2023. Atur juga EnableIntegrityProtection dan dokumen juga akan membawa token PDF MAC standalone, yang diperiksa ValidatePdfMac di sisi pembacaan

Itu adalah dua proteksi berbeda yang rutin dicampuradukkan orang. GCM mengautentikasi setiap nilai terenkripsi. MAC mengautentikasi dokumen secara keseluruhan. Anda menginginkan keduanya, dengan alasan yang berbeda

Apa yang ditambahkan GCM yang tidak pernah diberikan CBC?

Autentikasi ciphertext. AES-256 mode CBC, skema AESV3 di ISO 32000-2, menjaga konten tetap confidential dan tidak mengatakan apa pun soal apakah kontennya tiba tanpa modifikasi. CBC bersifat malleable dalam cara-cara spesifik yang sudah banyak diteliti: penyerang yang bisa membalik bit di ciphertext menghasilkan perubahan yang bisa diprediksi pada plaintext di block berikutnya, dan tidak ada apa pun di dalam formatnya yang menyadari hal itu

GCM menutup celah itu. Setiap nilai terenkripsi membawa authentication tag 16-byte, diserialisasi secara lengkap sebagaimana disyaratkan ISO/TS 32003, dan dekripsi akan gagal alih-alih mengembalikan plaintext yang sudah berubah saat tag-nya tidak cocok. Dalam istilah PDF, string atau stream yang dimanipulasi dalam dokumen AESV4 adalah hard error pada titik penggunaannya, bukan nilai aneh yang merambat ke dalam aplikasi Anda. Encrypt dictionary menandai ini dengan /CFM /AESV4 dan V 6 / R 7, bersama entri extensions yang mendeklarasikan /ExtensionLevel 32003 dan /ExtensionRevision (:2023)

Tiga revisi, tiga ekosistem

TPdfEncryptionRevision menawarkan erR5, erR6, dan erR7, dan pilihannya lebih merupakan keputusan kompatibilitas daripada keputusan kriptografis. R5 adalah skema AES-256 orisinal yang dipublikasikan sebagai ekstensi PDF 1.7, dengan satu hash password SHA-256, dan bisa dibuka di hampir semua hal dari lima belas tahun terakhir. R6 adalah key derivation yang diperkeras dan distandardisasi di ISO 32000-2, menggunakan konstruksi SHA-256/384/512 berulang dari algoritma 2.B, dan inilah yang diharapkan oleh workflow PDF 2.0 atau PDF/A-4 saat ini. R7 adalah ISO/TS 32003, menggunakan derivation 2.B yang sama dengan AES-GCM sebagai cipher

Dukungan reader berjalan persis dalam urutan itu, dan dukungan R7 masih tipis di luar viewer mainstream terkini. Ini adalah trade-off yang sama yang mengatur fitur PDF 2.0 mana pun: opsi terbaru adalah rekayasa terbaik dengan audiens paling sempit. Putuskan berdasarkan siapa yang harus membuka file itu, dan jika jawabannya adalah "sistem arsip yang tidak pernah diperbarui sejak 2019", jawabannya adalah R5 tidak peduli apa pun yang lebih disukai oleh kebijakan keamanan

uses
  PDFium, FPdfEncrypt;

var
  Pdf: TPdf;
  Opts: TPdfEncryptOptions;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.FileName := 'quarterly-report.pdf';
    Pdf.LoadDocument;

    Opts := TPdfEncryptOptions.Default;
    Opts.UserPassword := 'open-secret';
    Opts.OwnerPassword := 'admin-secret';
    Opts.EncryptMetadata := True;
    Opts.Revision := erR7;                    // ISO/TS 32003 AESV4-GCM
    Opts.EnableIntegrityProtection := True;   // standalone PDF MAC token

    if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
      raise Exception.Create('Encrypted save failed');
  finally
    Pdf.Free;
  end;
end;

Mengapa perlu document MAC di atas cipher yang sudah terautentikasi?

Karena tag GCM melindungi nilainya, bukan susunan nilai-nilai itu. Setiap string dan stream di dokumen AESV4 diautentikasi secara individual, tetapi cross-reference table, penomoran object, dan trailer adalah struktur, bukan konten terenkripsi. Penyerang tidak bisa memalsukan stream, tetapi tidak ada apa pun dalam cipher itu sendiri yang menghentikan mereka menyusun ulang object mana yang ditunjuk dokumen, atau menyisipkan object dari revisi file yang sama sebelumnya

Token PDF MAC standalone menangani lapisan itu. PDFiumPas menurunkannya dari file encryption key dengan /KDFSalt 32-byte khusus yang dicatat di Encrypt dictionary, sehingga kepemilikan password-lah yang memungkinkan sebuah reader mengonfirmasi token itu. Hasilnya adalah satu jawaban untuk satu pertanyaan: apakah dokumen ini, secara keseluruhan, adalah dokumen yang ditulis

var
  Pdf: TPdf;
  Mac: TPdfMacValidationResult;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.Password := 'open-secret';
    Pdf.FileName := 'quarterly-report.enc.pdf';
    Pdf.LoadDocument;

    Mac := Pdf.ValidatePdfMac('open-secret');
    case Mac.Status of
      pmvsValid:       ProcessDocument(Pdf);
      pmvsNotPresent:  ProcessWithWarning(Pdf);       // no token in this file
      pmvsInvalid:     Quarantine(Mac.MessageText);   // tampered or truncated
      pmvsUnsupported: RouteForManualReview(Mac.MessageText);
    end;
  finally
    Pdf.Free;
  end;
end;

Keempat nilai status itu membutuhkan empat respons berbeda, dan meleburnya menjadi boolean menghilangkan perbedaan yang penting. pmvsNotPresent berarti file itu memang tidak punya token, yang menggambarkan hampir setiap PDF terenkripsi yang ditulis sebelum 2024 dan bukan bukti apa-apa. pmvsInvalid berarti sebuah token ada namun tidak terverifikasi, yang merupakan temuan sungguhan dan seharusnya menghentikan pemrosesan. pmvsUnsupported berarti token itu ada dalam bentuk yang tidak diimplementasikan oleh build ini, yang merupakan celah kompatibilitas, bukan serangan. Memperlakukan "tidak ada" sama dengan "invalid" akan mengarantina seluruh katalog lama Anda pada hari pertama

Apa yang masih belum dilakukan enkripsi

Permission flag tetap menjadi apa yang selalu mereka miliki: sebuah permintaan kepada software yang patuh spesifikasi, bukan sebuah kontrol. Bit /P dari Table 22 ISO 32000-1 yang melarang printing atau ekstraksi dihormati oleh viewer yang berperilaku baik dan diabaikan oleh yang lainnya, dan siapa pun yang memegang user password sudah memegang konten yang terdekripsi. Enkripsi adalah batasnya; permission menjelaskan niat di dalam batas itu

Dua detail operasional layak direncanakan. Pertama, enkripsi dan modifikasi belakangan saling berinteraksi: menambahkan incremental update ke dokumen terenkripsi punya aturannya sendiri, dibahas di incremental update pada PDF terenkripsi, dan token MAC adalah pernyataan level dokumen yang akan dibatalkan oleh append yang ceroboh. Kedua, konstruksi GCM menggunakan IV counter deterministik, dan PDFiumPas akan raise, bukan menggunakan kembali nilai counter, jika ruang itu pernah habis, karena penggunaan ulang nonce di GCM bersifat bencana dengan cara yang akan disembunyikan oleh wraparound diam-diam

Memilih di antara ketiga revisi dalam praktiknya

Tuliskan siapa yang akan membuka file itu, lalu pilih. Untuk distribusi internal di mana setiap reader adalah viewer terkini yang berada di bawah kendali Anda, R7 dengan integrity protection adalah opsi terkuat yang tersedia dan tidak ada alasan untuk tidak memakainya. Untuk dokumen yang keluar dari organisasi, R6 adalah default yang mudah dipertahankan: distandardisasi di ISO 32000-2 alih-alih di spesifikasi teknis di atasnya, dan dukungannya luas. Untuk arsip dan konsumen legacy, R5 adalah satu-satunya pilihan yang bisa diandalkan untuk dibuka, dan Anda sebaiknya mencatat alasannya di tempat yang sama tempat Anda mencatat sisa kebijakan retensi Anda

Apa pun yang Anda pilih, verifikasi output-nya alih-alih hanya mempercayai bahwa pemanggilan itu berhasil. Buka kembali file terenkripsi itu, periksa ValidatePdfMac, dan konfirmasi bahwa versi yang dideklarasikan adalah yang Anda harapkan, menggunakan pemeriksaan version conformance di exact PDF version conformance. Checklist intake yang lebih luas untuk dokumen tidak tepercaya ada di auditing risiko keamanan PDF

PDFiumPas adalah komponen Delphi dan Lazarus di sekitar engine PDFium dengan stack enkripsi PDF 2.0 diimplementasikan secara native dalam Pascal, sehingga AES-256, GCM, dan token MAC tidak memerlukan DLL crypto eksternal. API enkripsinya didokumentasikan di halaman komponen Delphi PDFium