Enterprise edisi
Steganografi — Referensi Mendalam
Sekilas pandang
Bagian berjudul “Sekilas pandang”Referensi mendalam ini mendokumentasikan channel steganografi NextPDF Enterprise. Channel ini menyembunyikan payload terenkripsi di dalam penyesuaian kern numerik dari sebuah array penampil-teks TJ. Ia memiliki empat simbol publik: SteganographyEncoder, SteganographyDecoder, SteganographyConfig, dan SteganographyCapacity. Encoder menurunkan kunci dengan HKDF-SHA-256, mengenkripsi payload dengan cipher AEAD, dan mengembalikan offset kern per-posisi. Decoder membalik proses tersebut dari penyesuaian yang teramati atau dari content stream mentah.
Channel ini dirancang untuk pelacakan kebocoran dokumen internal. Ia bukan steganografi kelas-adversarial. Data terenkode dapat hancur oleh print-then-scan, konversi PDF, re-linearisasi, penulisan-ulang content stream, atau operasi apa pun yang menormalkan kerning. NextPDF tidak memegang sertifikasi apa pun untuk channel ini dan tidak memberikan sertifikasi apa pun. Halaman ini menyatakan kapabilitas, bukan konformansi.
Ketersediaan & lisensi
Bagian berjudul “Ketersediaan & lisensi”Kapabilitas ini hadir di NextPDF Enterprise (nextpdf/enterprise) dan diaktifkan dengan envelope lisensi tier-Enterprise. Deployment tanpa entitlement tersebut tidak memuat kelas-kelas kapabilitas ini. Bandingkan edisi dan dapatkan lisensi.
Permukaan API publik
Bagian berjudul “Permukaan API publik”Channel ini mengekspos empat kelas final. Semua entry point bersifat public static, kecuali konstruktor SteganographyConfig dan accessor effectiveMaxOffset-nya. NextPDF\Enterprise\Security\Steganography\SteganographyEncryptionException yang mendukungnya dilempar oleh encoder; ia bukan tipe yang dikonstruksi oleh pemanggil.
| Simbol | Parameter | Perilaku bawaan | Mengembalikan | Melempar atau gagal dengan | Catatan |
|---|---|---|---|---|---|
SteganographyEncoder::encode | $payload, $text, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig) | $payload kosong mengembalikan []; menegaskan kekuatan kunci; mengenkripsi; menghitung offset kern per-posisi. | array<int, float> (posisi => penyesuaian dalam 1/1000 em, konvensi AFM) | InvalidArgumentException (kunci di bawah batas); OverflowException (teks di bawah 2 karakter, atau payload melebihi kapasitas); SteganographyEncryptionException (kegagalan AEAD) | Teruskan hasilnya ke NextPDF\Content\TextRenderer::buildTjArrayOperator(). API mengembalikan penyesuaian konvensi-AFM; buildTjArrayOperator() melakukan konversi numerik PDF TJ (ISO 32000-2 mengurangkan angka tersebut dari posisi saat ini). Penulis content stream manual harus mempertahankan konvensi tanda tersebut. |
SteganographyEncoder::assertSecretKeyStrength | $secretKey | Menolak kunci yang lebih pendek dari batas. | void | InvalidArgumentException (kunci di bawah batas) | Penjaga jalur-tulis bersama, dicerminkan pada jalur-baca. |
SteganographyEncoder::MIN_SECRET_KEY_LENGTH | konstanta | Batas panjang-kunci 128-bit dalam byte. | int (16) | Tidak berlaku | Library menegakkan panjang, bukan entropi. |
SteganographyDecoder::decode | $observedAdjustments, $text, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig) | Menegaskan kekuatan kunci; mengkuantisasi deviasi; membangun ulang blob; mendekripsi-AEAD. | `string | null(payload, ataunull` pada kunci salah atau tidak ada payload) | InvalidArgumentException (kunci di bawah batas) |
SteganographyDecoder::decodeFromContentStream | $contentStream, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig) | Mentokenisasi stream, merekonstruksi teks dan penyesuaian dari array TJ, lalu mendelegasikan ke decode. | `string | null(payload, ataunullketika tidak ada teksTJ` atau dekripsi gagal) | InvalidArgumentException (kunci di bawah batas, via decode) |
SteganographyConfig::__construct | $bitDepth, $maxAdjustmentEmRatio, $cipher, $requirePdfACompatibility | Memvalidasi domain setiap argumen; menghasilkan value object imutabel. | Instance SteganographyConfig | InvalidArgumentException ($bitDepth, $maxAdjustmentEmRatio, atau $cipher tidak valid) | Kelas readonly; keempat argumen adalah properti public yang dipromosikan. |
SteganographyConfig::effectiveMaxOffset | tidak ada | Mengembalikan $maxAdjustmentEmRatio * 1000, dibagi dua ketika kompatibilitas PDF/A diminta. | float (offset dalam 1/1000 em) | Tidak berlaku | Pembagian-dua mengurangi risiko deteksi ketidaksesuaian-lebar. |
SteganographyConfig::CRYPTO_OVERHEAD | konstanta | Overhead enkripsi per-payload yang tetap dalam byte. | int (32) | Tidak berlaku | panjang 4-byte, nonce 12-byte, tag 16-byte. |
SteganographyCapacity::calculate | $text, $config (SteganographyConfig) | Menghitung byte payload yang dapat dipakai untuk teks, setelah overhead. | int (0 ketika teks terlalu pendek) | Tidak berlaku | Kapasitas adalah positions * bitDepth / 8 dikurangi overhead. |
SteganographyCapacity::minimumTextLength | $payloadBytes, $config (SteganographyConfig) | Menghitung jumlah karakter UTF-8 minimum untuk sebuah payload. | int (jumlah karakter) | Tidak berlaku | Kebalikan dari calculate. |
Tanda tangan verbatim menyusul, masing-masing dengan asal-usul sumber.
public static function encode( string $payload, string $text, string $fontKey, FontMetrics $metrics, string $secretKey, SteganographyConfig $config = new SteganographyConfig(),): arraypublic static function assertSecretKeyStrength(string $secretKey): voidpublic const int MIN_SECRET_KEY_LENGTH = 16;public static function decode( array $observedAdjustments, string $text, string $fontKey, FontMetrics $metrics, string $secretKey, SteganographyConfig $config = new SteganographyConfig(),): ?stringpublic static function decodeFromContentStream( string $contentStream, string $fontKey, FontMetrics $metrics, string $secretKey, SteganographyConfig $config = new SteganographyConfig(),): ?stringpublic function __construct( public int $bitDepth = 1, public float $maxAdjustmentEmRatio = 0.02, public string $cipher = 'aes-256-gcm', public bool $requirePdfACompatibility = false,)public function effectiveMaxOffset(): floatpublic const int CRYPTO_OVERHEAD = 32;public static function calculate( string $text, SteganographyConfig $config = new SteganographyConfig(),): intpublic static function minimumTextLength( int $payloadBytes, SteganographyConfig $config = new SteganographyConfig(),): intKontrak perilaku
Bagian berjudul “Kontrak perilaku”Encoder memecah $text menjadi karakter UTF-8 dan membentuk satu posisi per pasangan karakter berurutan. Setiap posisi membawa $config->bitDepth bit, yaitu satu atau dua. Payload pertama-tama dienkripsi, lalu diserialisasi menjadi blob, lalu dikonversi menjadi urutan bit. Setiap posisi mengenkode bit-nya sebagai offset non-negatif kecil yang ditambahkan ke nilai kern alami untuk pasangan karakter tersebut.
Offset adalah pecahan dari offset maksimum efektif. Offset maksimum efektif adalah $maxAdjustmentEmRatio * 1000 unit desain, dibagi dua ketika $requirePdfACompatibility bernilai true. Kern alami dibaca dari $metrics melalui FontMetrics::getKernPair. Peta yang dikembalikan bersifat sparse: posisi yang penyesuaian akhirnya tepat nol dihilangkan.
Enkripsi menggunakan HKDF-SHA-256 untuk menurunkan kunci 32-byte. Salt HKDF adalah $fontKey yang non-rahasia dan label info adalah konstanta tetap. Oleh karena itu $secretKey milik pemanggil adalah satu-satunya batas kerahasiaan. Cipher AEAD adalah aes-256-gcm atau chacha20-poly1305, dipilih oleh $config->cipher, dijalankan melalui openssl_encrypt dengan nonce 12-byte yang baru dan tag 16-byte. Blob terserialisasi adalah panjang big-endian 4-byte, nonce 12-byte, ciphertext, dan tag 16-byte; overhead tetap ini adalah CRYPTO_OVERHEAD, yaitu 32 byte.
Decoder membalik transformasi. Ia menghitung deviasi setiap penyesuaian yang teramati dari kern alami, menormalkan berdasarkan offset maksimum efektif, dan mengkuantisasi ke level terdekat. Ia menyusun ulang blob, memvalidasi header panjang, dan memanggil openssl_decrypt. Kunci yang salah, payload yang hilang, atau penyesuaian yang rusak menyebabkan autentikasi AEAD gagal, dan decoder mengembalikan null. decodeFromContentStream pertama-tama mentokenisasi stream mentah dengan NextPDF\Pro\Projection\ContentProjectionWriter::tokenize, merekonstruksi teks dan penyesuaian numerik dari setiap array TJ, lalu mendelegasikan ke decode.
SteganographyCapacity::calculate melaporkan ukuran payload yang dapat dipakai untuk suatu teks dan konfigurasi, setelah mengurangi CRYPTO_OVERHEAD; ia mengembalikan nol ketika teks terlalu pendek. SteganographyCapacity::minimumTextLength adalah kebalikannya: jumlah karakter UTF-8 terkecil yang mengizinkan payload dengan ukuran yang diminta.
Kasus tepi & mode kegagalan
Bagian berjudul “Kasus tepi & mode kegagalan”$payloadkosong mengembalikan peta kosong dariencode; tidak ada byte yang ditulis, dan penjaga kekuatan-kunci tidak tercapai.- Untuk payload yang tidak kosong,
$textdengan kurang dari dua karakter memunculkanOverflowExceptiondiencode(payload kosong men-short-circuit ke[]sebelum pemeriksaan panjang); teks yang sama menghasilkannulldidecodedan nol diSteganographyCapacity::calculate. $payloadyang lebih besar dari kapasitas teks memunculkanOverflowExceptionsebelum penyesuaian apa pun dipancarkan.$secretKeyyang lebih pendek dariMIN_SECRET_KEY_LENGTH(16 byte) memunculkanInvalidArgumentExceptionpada jalur tulis maupun baca. Ini adalah pelanggaran kontrak, berbeda dari kesalahan kunci-salah yang normal.- Kunci yang salah, set penyesuaian yang rusak, atau blob yang terpotong menyebabkan
decodemengembalikannullmelalui kegagalan autentikasi AEAD, bukan eksepsi. - Posisi yang absen dari peta
$observedAdjustmentsyang sparse diperlakukan sebagai deviasi nol selama ekstraksi. decodeFromContentStreammengembalikannullketika stream tidak mengandung teksTJ.- Channel ini rapuh secara desain. Print-then-scan, konversi PDF, re-linearisasi, penulisan-ulang content stream, atau normalisasi kerning dapat menghancurkan data terenkode. Ia tidak cocok untuk penggunaan adversarial atau arsip.
Perilaku mode-FIPS
Bagian berjudul “Perilaku mode-FIPS”Channel ini menggunakan HKDF-SHA-256 untuk penurunan kunci dan satu cipher AEAD untuk kerahasiaan dan integritas. NextPDF tidak memegang validasi FIPS apa pun untuk channel ini dan tidak mengklaim apa pun. Modul tidak menegakkan profil FIPS; pemilihan cipher adalah keputusan pemanggil melalui $config->cipher. aes-256-gcm adalah AES dalam Galois/Counter Mode, sebuah mode enkripsi-terautentikasi yang dibangun di atas block cipher 128-bit yang disetujui yang konformansinya divalidasi di bawah CMVP, sesuai NIST SP 800-38D §2. chacha20-poly1305 tidak didefinisikan oleh rekomendasi mode-operasi NIST, sehingga provider OpenSSL yang dibatasi-FIPS menolaknya; openssl_encrypt kemudian mengembalikan false dan encoder memunculkan SteganographyEncryptionException. Apakah suatu deployment memenuhi persyaratan FIPS adalah penentuan operator terhadap provider tervalidasinya, bukan pernyataan NextPDF.
Konformansi
Bagian berjudul “Konformansi”Penyematan menulis elemen numerik ke dalam array penampil-teks TJ. Sesuai ISO 32000-2:2020 §9.4.3, array TJ menampilkan teks dan mengizinkan elemen numerik menyesuaikan posisi glyph; angka tersebut dinyatakan dalam per-seribu unit text-space dan dikurangkan dari posisi saat ini. Setelah sebuah glyph dilukis, matriks teks ditranslasikan oleh perpindahan gabungan, sehingga angka pemosisian menggeser penempatan glyph-glyph berikutnya — ISO 32000-2:2020 §9.4.4. Channel menambahkan offset-nya ke nilai kern alami dalam konvensi 1/1000 em (AFM) yang sama, di mana nilai negatif merapatkan spasi.
Dasar AEAD terbatas pada pemilihan primitif: aes-256-gcm berkorespondensi dengan mode GCM dari NIST SP 800-38D §2. Referensi tersebut mengidentifikasi sebuah algoritma; ia bukan validasi channel ini.
Semua klausa diparafrasekan; NextPDF tidak mereproduksi teks normatif. NextPDF tidak membuat klaim konformansi steganografi, kriptografi, atau PDF apa pun untuk channel ini. Keselarasan struktural dengan model pemosisian TJ adalah pernyataan kapabilitas, bukan sertifikasi. Pengungkapan ketahanan tetap berlaku: channel ini untuk pelacakan kebocoran internal, dan ia bukan kelas-adversarial.
Catatan pengembangan
Bagian berjudul “Catatan pengembangan”- Entry point adalah metode
public staticdiNextPDF\Enterprise\Security\Steganography, kecuali konstruktorSteganographyConfigdaneffectiveMaxOffset. SteganographyConfigadalah value objectfinal readonly. Keempat propertinya imutabel setelah konstruksi, dan domain argumennya divalidasi di konstruktor:$bitDepthadalah 1 atau 2,$maxAdjustmentEmRatioberada di(0, 0.05], dan$cipheradalahaes-256-gcmatauchacha20-poly1305.- Keluaran encode dikonsumsi oleh
NextPDF\Content\TextRenderer::buildTjArrayOperator. Pasangan kern berasal dariNextPDF\Typography\FontMetrics. Dekode content stream membaca melaluiNextPDF\Pro\Projection\ContentProjectionWriterdan tidak memutasi stream. - Batas panjang-kunci ditegakkan di entry point dan ditegaskan kembali di batas kripto privat, sehingga tidak ada jalur internal yang dapat mencapai HKDF dengan kunci lemah. Library menegakkan panjang, bukan entropi; menyediakan material kunci ber-entropi-tinggi adalah tanggung jawab integrator.
CRYPTO_OVERHEAD(32 byte) adalah biaya tetap per payload dan sudah dikurangkan olehSteganographyCapacity::calculate.- Nilai since yang didokumentasikan adalah
3.1.0untuk permukaan Enterprise teragregasi.SteganographyEncryptionExceptionmewarisiRuntimeException, sehingga call site yang menangkap tipe runtime generik tetap berfungsi.
Lihat juga
Bagian berjudul “Lihat juga”- Steganografi (halaman kapabilitas) — ikhtisar berorientasi-tugas dari channel pelacakan-kebocoran.
- Keamanan — Referensi Mendalam — permukaan keamanan Enterprise seinduk.
- Lisensi dan aktivasi — bagaimana envelope lisensi Enterprise diterapkan.
Batas publikasi
Bagian berjudul “Batas publikasi”Halaman ini mendokumentasikan hanya perilaku yang dapat diamati secara eksternal dan permukaan API publik yang didukung. Jalur namespace internal, kelas helper, tabel mekanisme, nama file runbook, dan prefiks tiket berada di luar cakupan.