Technical Article

Devasa Belgeler İçin Yüksek Hızlı AES-256 PDF Şifrelemesi

Hukuk, finans ve sağlık sektörlerinde büyük hacimli PDF belgeleri oluşturmak standart bir uygulamadır. Ancak belgeleri üretmek işin sadece yarısıdır; onları güvence altına almak da aynı derecede kritiktir. Günde yüzlerce gigabaytlık PDF'i işleyen bir arşiv boru hattınız (pipeline) olduğunda, AES-256 şifrelemesi uygulamak hızla bir performans darboğazı haline gelebilir.

Bu makalede, bellek tükenmesinden kaçınarak ve kriptografik döngüleri optimize ederek Delphi'de yüksek hızlı AES-256 PDF şifrelemesinin nasıl elde edileceğini keşfedeceğiz.

PDF Şifreleme Spesifikasyonu

PDF güvenliği önemli ölçüde gelişti. Erken sürümler, bugün kolayca kırılabilen 40-bit RC4 kullanıyordu. Mevcut standart (PDF 1.7 Uzantı Seviyesi 3 ve PDF 2.0) AES-256 şifrelemesini zorunlu kılar.

Bir PDF'de, tüm dosya bloğunu şifrelemezsiniz. Belge yapısı (XRef tablosu ve sözlüklerin yapısı) düz metin (plaintext) olarak kalır. Bunun yerine, Akışları (Streams - resimler ve sayfa içeriği için ham veriler) ve Dizeleri (Strings - meta veri metni gibi) şifrelersiniz. Bu, ayrıştırıcının (parser) verileri çıkarmasını, AES CBC'yi (Cipher Block Chaining) uygulamasını ve geri yazmasını gerektirir.

Darboğaz: Belleğe Yükleme

Devasa bir PDF'i (örneğin, 2GB'lık taranmış bir arşiv) şifrelerken yapılan yaygın bir hata, tüm akışı (stream) kriptografik motora geçirmeden önce bir TMemoryStream içine yüklemektir. Bu, 32-bit işlemlerinde Bellek Yetersizliği (Out-Of-Memory - OOM) istisnalarına ve 64-bit işlemlerinde devasa sayfa hatalarına (page faulting) yol açar.

Delphi'de Akış (Streaming) Şifrelemesi

Çözüm, parçalı (chunked), akışlı (streaming) bir yaklaşım kullanmaktır. Windows Şifreleme API'si: Yeni Nesil (Cryptography API: Next Generation - CNG) veya OpenSSL gibi bir kütüphane kullanarak, PDF akışını 64KB'lık bloklar halinde okuyabilir, bloğu şifreleyebilir ve doğrudan çıktı disk akışına (output disk stream) yazabilirsiniz.

İşte bir akış (stream) için arabelleğe alınmış (buffered) bir şifreleme döngüsünü gösteren kavramsal bir Delphi örneği:

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;

Kriptografik Arka Ucu (Backend) Optimize Etme

Delphi geliştiricilerinin AES arka ucu için birkaç seçeneği vardır:

  • Yerel Delphi uygulamaları: Dağıtımı kolaydır, ancak tamamen yazılımda yürütüldükleri için genellikle daha yavaştır.
  • Windows CNG (BCrypt): Yüksek düzeyde optimize edilmiştir ve donanım hızlandırmasını (modern Intel/AMD CPU'larda AES-NI talimatları) kullanabilir.
  • OpenSSL (libcrypto): Endüstri standardıdır, inanılmaz derecede hızlıdır, ancak harici DLL'lerin dağıtılmasını gerektirir.

Yüksek verimli sunucu uygulamaları için donanım hızlandırmalı AES-NI zorunludur. Delphi'de Windows CNG'yi kullanırken BCryptEncrypt işlevini eşlemek, uygulamanızın ağır işleri CPU'nun özel kriptografik silikonuna devretmesine olanak tanır ve şifreleme yükünü etkili bir şekilde sıfıra indirir.

Sonuç

Gigabayt ölçekli PDF'leri şifrelerken, tam bellek arabelleğe alma (full memory buffering) yerine akış parçalama (stream chunking) yöntemine güvenin ve kriptografik arka ucunuzun donanım AES-NI hızlandırmasını kullandığından emin olun. Bu kombinasyon, arşiv boru hattınızın işlemciye (CPU) bağlı kalmak yerine NVMe sürücülerinizin hızında çalışmasını garanti eder.

Not: Parçalı akış (chunked streaming) kullanan yüksek hızlı AES-256 şifrelemesi, HotPDF VCL Component bileşeninde yerel olarak desteklenmektedir.