Di sektor hukum, keuangan, dan perawatan kesehatan, menghasilkan dokumen PDF dalam jumlah besar adalah praktik standar. Namun, menghasilkan dokumen hanyalah separuh perjuangan; mengamankannya sama kritisnya. Saat Anda memiliki jalur arsip yang memproses ratusan gigabyte PDF setiap hari, menerapkan enkripsi AES-256 dapat dengan cepat menjadi hambatan kinerja.
Dalam artikel ini, kita akan menjelajahi cara mencapai enkripsi PDF AES-256 berkecepatan tinggi di Delphi dengan menghindari kelelahan memori dan mengoptimalkan putaran kriptografi.
Spesifikasi Enkripsi PDF
Keamanan PDF telah berkembang secara signifikan. Versi awal menggunakan RC4 40-bit, yang dapat dipecahkan dengan mudah saat ini. Standar saat ini (PDF 1.7 Extension Level 3 dan PDF 2.0) mengamanatkan enkripsi AES-256.
Di PDF, Anda tidak mengenkripsi seluruh blok file. Struktur dokumen (tabel XRef dan struktur kamus) tetap dalam format teks biasa (plaintext). Sebagai gantinya, Anda mengenkripsi Aliran (yaitu data mentah untuk gambar dan konten halaman) dan String (seperti teks metadata). Ini mengharuskan parser untuk mengekstrak data, menerapkan AES CBC (Cipher Block Chaining), dan menulisnya kembali.
Hambatannya: Memuat ke Memori
Kesalahan umum saat mengenkripsi PDF masif (misalnya, arsip pindaian 2GB) adalah memuat seluruh aliran ke dalam TMemoryStream sebelum meneruskannya ke mesin kriptografi. Hal ini menyebabkan pengecualian Out-Of-Memory (OOM) pada proses 32-bit dan kesalahan halaman masif pada proses 64-bit.
Enkripsi Streaming di Delphi
Solusinya adalah menggunakan pendekatan aliran yang dipotong-potong (chunked). Menggunakan API Kriptografi Windows: Next Generation (CNG) atau pustaka seperti OpenSSL, Anda dapat membaca aliran PDF dalam blok 64KB, mengenkripsi blok tersebut, dan menulisnya langsung ke aliran disk keluaran. Berikut adalah contoh Delphi konseptual yang mendemonstrasikan putaran enkripsi ber-buffer untuk aliran:
uses
System.Classes, System.SysUtils;
const
BUFFER_SIZE = 65536; // 64KB chunks
// This represents your AES-256 encryption routine
procedure EncryptStreamChunk(const InBuffer; var OutBuffer; BytesRead: Integer; const Key: TBytes; const IV: TBytes);
begin
// Call to Windows CNG (BCryptEncrypt) or OpenSSL (EVP_EncryptUpdate)
// ...
end;
procedure EncryptLargePDFStream(InputStream, OutputStream: TStream; const Key, IV: TBytes);
var
InBuffer, OutBuffer: array of Byte;
BytesRead: Integer;
begin
SetLength(InBuffer, BUFFER_SIZE);
// AES CBC requires padding, so the output buffer must be slightly larger
SetLength(OutBuffer, BUFFER_SIZE + 16);
InputStream.Position := 0;
OutputStream.Position := 0;
repeat
BytesRead := InputStream.Read(InBuffer[0], BUFFER_SIZE);
if BytesRead > 0 then
begin
EncryptStreamChunk(InBuffer[0], OutBuffer[0], BytesRead, Key, IV);
// Write the encrypted cipher text directly to disk
OutputStream.Write(OutBuffer[0], BytesRead); // Note: padding logic omitted for brevity
end;
until BytesRead < BUFFER_SIZE;
end;
Mengoptimalkan Backend Kriptografi
Pengembang Delphi memiliki beberapa pilihan untuk backend AES:
- Implementasi native Delphi: Mudah diterapkan, tetapi sering kali lebih lambat karena berjalan sepenuhnya di perangkat lunak.
- Windows CNG (BCrypt): Sangat dioptimalkan dan dapat memanfaatkan akselerasi perangkat keras (instruksi AES-NI pada CPU Intel/AMD modern).
- OpenSSL (libcrypto): Standar industri, sangat cepat, tetapi membutuhkan pengiriman DLL eksternal.
Untuk aplikasi server dengan throughput tinggi, AES-NI berakselerasi perangkat keras adalah wajib. Saat menggunakan Windows CNG di Delphi, pemetaan fungsi BCryptEncrypt memungkinkan aplikasi Anda untuk meringankan beban kerja berat ke silikon kriptografi khusus CPU, secara efektif mengurangi overhead enkripsi hingga mendekati nol.
Kesimpulan
Saat mengenkripsi PDF berskala gigabyte, andalkan pemotongan aliran daripada buffer memori penuh, dan pastikan backend kriptografi Anda memanfaatkan akselerasi AES-NI perangkat keras. Kombinasi ini menjamin bahwa jalur arsip Anda berjalan dengan kecepatan drive NVMe Anda, dan bukannya dibatasi oleh CPU.
Catatan: Enkripsi AES-256 berkecepatan tinggi yang memanfaatkan streaming potongan didukung secara native dalam Komponen VCL HotPDF.