İçeriğe geç
getnextpdf.com

Enterprise sürüm

Steganografi — Derinlemesine başvuru

Bu derin referans, NextPDF Enterprise steganografik kanalını belgeler. Kanal, bir TJ metin gösterme dizisinin sayısal kerning ayarlamalarının içine şifreli bir yük gizler. Dört genel sembolü vardır: SteganographyEncoder, SteganographyDecoder, SteganographyConfig ve SteganographyCapacity. Kodlayıcı, HKDF-SHA-256 ile bir anahtar türetir, yükü bir AEAD şifresiyle şifreler ve konum başına kerning ofsetleri döndürür. Kod çözücü, gözlemlenen ayarlamalardan veya ham bir içerik akışından süreci tersine çevirir.

Kanal, dahili belge sızıntısı izleme için tasarlanmıştır. Rakip düzeyinde steganografi değildir. Kodlanmış veriler yazdır-sonra-tara, PDF dönüşümü, yeniden doğrusallaştırma, içerik akışı yeniden yazımı veya kerning’i normalleştiren herhangi bir işlemle yok olabilir. NextPDF, bu kanal için herhangi bir sertifikaya sahip değildir ve hiçbir sertifika vermez. Bu sayfa uygunluğu değil, yeteneği ifade eder.

Bu yetenek NextPDF Enterprise (nextpdf/enterprise) ile birlikte gelir ve bir Enterprise katmanı lisans zarfıyla etkinleşir. Bu yetkilendirmeye sahip olmayan bir dağıtım, yeteneğin sınıflarını yüklemez. Sürümleri karşılaştırın ve bir lisans edinin.

Kanal, dört final sınıfı açığa çıkarır. SteganographyConfig yapıcısı ve onun effectiveMaxOffset erişimcisi dışında tüm giriş noktaları public static’tir. Destekleyici NextPDF\Enterprise\Security\Steganography\SteganographyEncryptionException, kodlayıcı tarafından fırlatılır; çağıran tarafından oluşturulan bir tür değildir.

SymbolParametersDefault behaviorReturnsThrows or fails withNotes
SteganographyEncoder::encode$payload, $text, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig)Boş $payload, [] döndürür; anahtar gücünü doğrular; şifreler; konum başına kerning ofsetlerini hesaplar.array<int, float> (konum => 1/1000 em cinsinden ayarlama, AFM kuralı)InvalidArgumentException (taban değerin altındaki anahtar); OverflowException (2 karakterden az metin veya kapasitenin üzerinde yük); SteganographyEncryptionException (AEAD hatası)Sonucu NextPDF\Content\TextRenderer::buildTjArrayOperator()’a geçirin. API, AFM kuralı ayarlamaları döndürür; buildTjArrayOperator(), PDF TJ sayısal dönüşümünü gerçekleştirir (ISO 32000-2 sayıyı geçerli konumdan çıkarır). El ile yazan içerik akışı yazarları bu işaret kuralını korumalıdır.
SteganographyEncoder::assertSecretKeyStrength$secretKeyTaban değerden daha kısa bir anahtarı reddeder.voidInvalidArgumentException (taban değerin altındaki anahtar)Paylaşılan yazma yolu koruması, okuma yolunda da yansıtılır.
SteganographyEncoder::MIN_SECRET_KEY_LENGTHconstantBayt cinsinden 128 bitlik anahtar uzunluğu taban değeri.int (16)UygulanamazKütüphane, entropiyi değil uzunluğu zorlar.
SteganographyDecoder::decode$observedAdjustments, $text, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig)Anahtar gücünü doğrular; sapmaları nicemler; blob’u yeniden oluşturur; AEAD ile şifre çözer.`stringnull(yük veya yanlış anahtarda ya da yük yokkennull`)InvalidArgumentException (taban değerin altındaki anahtar)
SteganographyDecoder::decodeFromContentStream$contentStream, $fontKey, $metrics (FontMetrics), $secretKey, $config (SteganographyConfig)Akışı belirteçlere ayırır, TJ dizilerinden metni ve ayarlamaları yeniden oluşturur, ardından decode’a devreder.`stringnull(yük veyaTJmetni yokken ya da şifre çözme başarısız olduğundanull`)InvalidArgumentException (decode üzerinden taban değerin altındaki anahtar)
SteganographyConfig::__construct$bitDepth, $maxAdjustmentEmRatio, $cipher, $requirePdfACompatibilityHer argüman alanını doğrular; değiştirilemez bir değer nesnesi üretir.SteganographyConfig örneğiInvalidArgumentException (geçersiz $bitDepth, $maxAdjustmentEmRatio veya $cipher)readonly sınıf; dört argüman genel, tanıtılmış özelliklerdir.
SteganographyConfig::effectiveMaxOffsetnone$maxAdjustmentEmRatio * 1000 döndürür; PDF/A uyumluluğu istendiğinde yarıya indirilir.float (1/1000 em cinsinden ofset)UygulanamazYarıya indirme, genişlik uyumsuzluğu tespit riskini azaltır.
SteganographyConfig::CRYPTO_OVERHEADconstantBayt cinsinden yük başına sabit şifreleme ek yükü.int (32)Uygulanamaz4 baytlık uzunluk, 12 baytlık nonce, 16 baytlık etiket.
SteganographyCapacity::calculate$text, $config (SteganographyConfig)Ek yükten sonra metin için kullanılabilir yük baytlarını hesaplar.int (metin çok kısa olduğunda 0)UygulanamazKapasite, positions * bitDepth / 8 eksi ek yüktür.
SteganographyCapacity::minimumTextLength$payloadBytes, $config (SteganographyConfig)Bir yük için asgari UTF-8 karakter sayısını hesaplar.int (karakter sayısı)Uygulanamazcalculate’in tersidir.

Sözcüğü sözcüğüne imzalar, her biri kaynak kökeniyle aşağıda verilmiştir.

public static function encode(
string $payload,
string $text,
string $fontKey,
FontMetrics $metrics,
string $secretKey,
SteganographyConfig $config = new SteganographyConfig(),
): array
public static function assertSecretKeyStrength(string $secretKey): void
public 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(),
): ?string
public static function decodeFromContentStream(
string $contentStream,
string $fontKey,
FontMetrics $metrics,
string $secretKey,
SteganographyConfig $config = new SteganographyConfig(),
): ?string
public function __construct(
public int $bitDepth = 1,
public float $maxAdjustmentEmRatio = 0.02,
public string $cipher = 'aes-256-gcm',
public bool $requirePdfACompatibility = false,
)
public function effectiveMaxOffset(): float
public const int CRYPTO_OVERHEAD = 32;
public static function calculate(
string $text,
SteganographyConfig $config = new SteganographyConfig(),
): int
public static function minimumTextLength(
int $payloadBytes,
SteganographyConfig $config = new SteganographyConfig(),
): int

Kodlayıcı, $text’i UTF-8 karakterlerine böler ve ardışık her karakter çifti için bir konum oluşturur. Her konum, bir veya iki olan $config->bitDepth bit taşır. Yük önce şifrelenir, ardından bir blob’a serileştirilir, sonra bir bit dizisine dönüştürülür. Her konum, bitlerini o karakter çiftinin doğal kerning değerine eklenen küçük, negatif olmayan bir ofset olarak kodlar.

Ofset, etkin azami ofsetin bir kesridir. Etkin azami ofset, $maxAdjustmentEmRatio * 1000 tasarım birimidir; $requirePdfACompatibility doğru olduğunda yarıya indirilir. Doğal kerning, $metrics’ten FontMetrics::getKernPair aracılığıyla okunur. Döndürülen eşleme seyrektir: nihai ayarlaması tam olarak sıfır olan bir konum atlanır.

Şifreleme, 32 baytlık bir anahtar türetmek için HKDF-SHA-256 kullanır. HKDF tuzu, gizli olmayan $fontKey’dir ve info etiketi sabit bir değişmezdir. Bu nedenle çağıranın $secretKey’i tek gizlilik sınırıdır. AEAD şifresi, $config->cipher ile seçilen aes-256-gcm veya chacha20-poly1305’tir; taze bir 12 baytlık nonce ve 16 baytlık bir etiketle openssl_encrypt üzerinden çalıştırılır. Serileştirilmiş blob, 4 baytlık büyük uçlu bir uzunluk, 12 baytlık nonce, şifreli metin ve 16 baytlık etikettir; bu sabit ek yük, 32 bayt olan CRYPTO_OVERHEAD’dir.

Kod çözücü, dönüşümü tersine çevirir. Gözlemlenen her ayarlamanın doğal kerning’den sapmasını hesaplar, etkin azami ofsete göre normalleştirir ve en yakın seviyeye nicemler. Blob’u yeniden birleştirir, uzunluk başlığını doğrular ve openssl_decrypt’i çağırır. Yanlış bir anahtar, eksik bir yük veya bozuk ayarlamalar AEAD kimlik doğrulamasının başarısız olmasına neden olur ve kod çözücü null döndürür. decodeFromContentStream, önce ham akışı NextPDF\Pro\Projection\ContentProjectionWriter::tokenize ile belirteçlere ayırır, her TJ dizisinden metni ve sayısal ayarlamaları yeniden oluşturur ve ardından decode’a devreder.

SteganographyCapacity::calculate, CRYPTO_OVERHEAD’i çıkardıktan sonra bir metin ve yapılandırma için kullanılabilir yük boyutunu bildirir; metin çok kısa olduğunda sıfır döndürür. SteganographyCapacity::minimumTextLength bunun tersidir: istenen boyutta bir yükü kabul eden en küçük UTF-8 karakter sayısı.

  • Boş bir $payload, encode’dan boş bir eşleme döndürür; hiçbir bayt yazılmaz ve anahtar gücü korumasına ulaşılmaz.
  • Boş olmayan bir yük için, ikiden az karaktere sahip bir $text, encode’da OverflowException fırlatır (boş bir yük, uzunluk kontrolünden önce []’ye kısa devre yapar); aynı metin, decode’da null ve SteganographyCapacity::calculate’te sıfır verir.
  • Metin kapasitesinden büyük bir $payload, herhangi bir ayarlama yayınlanmadan önce OverflowException fırlatır.
  • MIN_SECRET_KEY_LENGTH’ten (16 bayt) daha kısa bir $secretKey, hem yazma hem de okuma yolunda InvalidArgumentException fırlatır. Bu bir sözleşme ihlalidir ve normal bir yanlış anahtar ıskalamasından ayrıdır.
  • Yanlış bir anahtar, bozuk bir ayarlama kümesi veya kesilmiş bir blob, decode’un bir istisna değil, AEAD kimlik doğrulama hatası aracılığıyla null döndürmesine neden olur.
  • Seyrek bir $observedAdjustments eşlemesinden yoksun konumlar, çıkarma sırasında sıfır sapma olarak ele alınır.
  • decodeFromContentStream, akış hiçbir TJ metni içermediğinde null döndürür.
  • Kanal, tasarım gereği kırılgandır. Yazdır-sonra-tara, PDF dönüşümü, yeniden doğrusallaştırma, içerik akışı yeniden yazımı veya kerning normalleştirme, kodlanmış verileri yok edebilir. Rakip veya arşiv amaçlı kullanıma uygun değildir.

Kanal, anahtar türetme için HKDF-SHA-256 ve gizlilik ile bütünlük için bir AEAD şifresi kullanır. NextPDF, bu kanal için herhangi bir FIPS doğrulamasına sahip değildir ve hiçbir iddiada bulunmaz. Modül, bir FIPS profilini zorlamaz; şifre seçimi, $config->cipher aracılığıyla çağıranın kararıdır. aes-256-gcm, Galois/Counter Modunda AES’tir; NIST SP 800-38D §2 uyarınca uygunluğu CMVP altında doğrulanan onaylı bir 128 bitlik blok şifre üzerine kurulu, kimlik doğrulamalı bir şifreleme modudur. chacha20-poly1305, bir NIST işletim modu önerisiyle tanımlanmamıştır, bu nedenle FIPS kısıtlı bir OpenSSL sağlayıcısı bunu reddeder; openssl_encrypt bunun ardından false döndürür ve kodlayıcı SteganographyEncryptionException fırlatır. Bir dağıtımın bir FIPS gereksinimini karşılayıp karşılamadığı, bir NextPDF iddiası değil, operatörün doğrulanmış sağlayıcısına karşı belirlemesidir.

Gömme, bir TJ metin gösterme dizisine sayısal öğeler yazar. ISO 32000-2:2020 §9.4.3 uyarınca, bir TJ dizisi metni gösterir ve sayısal bir öğenin glif konumunu ayarlamasına izin verir; sayı, bir metin uzayı biriminin binde biri cinsinden ifade edilir ve geçerli konumdan çıkarılır. Bir glif boyandıktan sonra, metin matrisi birleşik yer değiştirmeyle ötelenir, böylece bir konumlandırma sayısı sonraki gliflerin yerleşimini kaydırır — ISO 32000-2:2020 §9.4.4. Kanal, ofsetlerini doğal kerning değerlerine, negatif bir değerin aralığı sıkılaştırdığı aynı 1/1000 em (AFM) kuralında ekler.

AEAD dayanağı, ilkel seçimiyle sınırlıdır: aes-256-gcm, NIST SP 800-38D §2’nin GCM moduna karşılık gelir. Bu referans bir algoritmayı tanımlar; bu kanalın bir doğrulaması değildir.

Tüm maddeler açımlanmıştır; NextPDF normatif metni yeniden üretmez. NextPDF, bu kanal için hiçbir steganografi, kriptografi veya PDF uygunluk iddiasında bulunmaz. TJ konumlandırma modeliyle yapısal hizalama, bir sertifika değil, bir yetenek ifadesidir. Dayanıklılık açıklaması geçerlidir: kanal dahili sızıntı izleme içindir ve rakip düzeyinde değildir.

  • Giriş noktaları, SteganographyConfig yapıcısı ve effectiveMaxOffset dışında, NextPDF\Enterprise\Security\Steganography içindeki public static metotlardır.
  • SteganographyConfig, bir final readonly değer nesnesidir. Dört özelliği yapımdan sonra değiştirilemez ve argüman alanları yapıcıda doğrulanır: $bitDepth 1 veya 2’dir, $maxAdjustmentEmRatio (0, 0.05] aralığındadır ve $cipher aes-256-gcm veya chacha20-poly1305’tir.
  • encode çıktısı, NextPDF\Content\TextRenderer::buildTjArrayOperator tarafından tüketilir. Kerning çiftleri NextPDF\Typography\FontMetrics’ten gelir. İçerik akışı kod çözme, NextPDF\Pro\Projection\ContentProjectionWriter aracılığıyla okur ve akışı değiştirmez.
  • Anahtar uzunluğu taban değeri, giriş noktasında zorlanır ve özel kripto sınırında yeniden doğrulanır, böylece hiçbir dahili yol zayıf bir anahtarla HKDF’ye ulaşamaz. Kütüphane, entropiyi değil uzunluğu zorlar; yüksek entropili anahtar malzemesi sağlamak entegratörün sorumluluğundadır.
  • CRYPTO_OVERHEAD (32 bayt), yük başına sabit maliyettir ve SteganographyCapacity::calculate tarafından zaten çıkarılmıştır.
  • Belgelenen since, birleştirilmiş Enterprise yüzeyi için 3.1.0’dır. SteganographyEncryptionException, RuntimeException’ı genişletir, bu nedenle genel çalışma zamanı türünü yakalayan çağrı siteleri çalışmaya devam eder.

Bu sayfa yalnızca dışarıdan gözlemlenebilir davranışı ve desteklenen genel API yüzeyini belgeler. Dahili ad alanı yolları, yardımcı sınıflar, mekanizma tabloları, çalışma kitabı dosya adları ve bilet önekleri kapsam dışıdır.