Görünmez, ama kriptografik.
Bir filigranın değeri, gizli olmasından değil, içeriğe bağlı olmasından gelir. jettymark'ta her paragraf, her görsel ve her 2 saniyelik video parçası kendi Ed25519 imzasını taşır. Metinde imza beş görünmez Unicode karakteriyle kelime sonlarına dağıtılır; görüntüde parlaklığa eklenen görünmez bir desenle piksellere. İkisi de herkesin okuyabildiği açık bir formatla doğrulanır.
Beş karakter, iki bit
Seçilen karakterlerin tamamı Unicode'un "varsayılan yok sayılabilir" sınıfında: fontta glif olmasa bile sıfır genişlikte çizilir. Hiçbiri doğal dillerde geçmez; Tayca ya da Farsçada anlam taşıyan U+200B ve U+200C ailesinden değildir ve "görünmez karakter temizleyici" filtrelerin hedefinde çok daha az bulunur.
Bir dizi, her zaman kelimenin sonuna, boşluktan hemen önce eklenir. Böylece satır kırma fırsatı eklenmez veya silinmez, kelime yazım denetiminde ikiye bölünmez.
| Karakter | Ad | Rol |
|---|---|---|
| U+2060 | WORD JOINER | Çerçeve başlangıcı (senkron) |
| U+2061 | FUNCTION APPLICATION | Sembol değeri 0 |
| U+2062 | INVISIBLE TIMES | Sembol değeri 1 |
| U+2063 | INVISIBLE SEPARATOR | Sembol değeri 2 |
| U+2064 | INVISIBLE PLUS | Sembol değeri 3 |
Bir bayt = 4 sembol. 87 baytlık çerçeve = 348 görünmez karakter; UTF-8'de paragraf başına yaklaşık 1 KB.
İmza görünen metne değil, kanonik metne atılır
İmzalayan ve doğrulayan, metni aynı kurallarla sadeleştirir: görünmez karakterler atılır, NFC uygulanır, tırnak-tire-üç nokta tek forma indirilir, kelimeler tek boşlukla birleştirilir. Aktarımda değişen her şey bu sadeleştirmede yok olur; içeriği değiştiren her şey imzayı düşürür.
- Satır sonlarının değişmesi, paragrafların birleşmesi
- Düz tırnak ↔ akıllı tırnak, tire ↔ uzun tire, üç nokta ↔ …
- Kesilmez boşluk, ince boşluk, çift boşluk
- ş / ğ / ü için NFC ↔ NFD (bileşik ↔ ayrık)
- Soft hyphen, BOM, varyasyon seçicileri gibi görünmezler
- HTML entity kodlaması (örn. ⁠)
- Bir harfin, rakamın ya da kelimenin değişmesi
- Kelime silinmesi veya kelime araya eklenmesi
- Blok içinde cümle sırasının değişmesi
- Büyük/küçük harf değişikliği (İ/ı dahil)
- Noktalamanın anlam değiştirecek biçimde değişmesi
- İşaretin başka bir metne taşınması
Her blokta 87 bayt
Başlık, yayıncı anahtarının kimliğini, belge kimliğini, blok numarasını ve zamanı taşır; ardından 64 baytlık imza ve bir sağlama gelir. Başlığın kendi sağlaması vardır: bir kelime görünmez diziyle birlikte silinse bile blok "hangi belgenin kaçıncı bloğu" diye hâlâ atfedilebilir.
İmzalanan mesaj
"TMK1" ‖ başlık ‖ SHA-256(kanonik blok metni). Başlık imzanın içinde olduğundan belge kimliği, blok numarası ve alıcı da değiştirilemez.
Yerleşim
Senkron + başlık bloğun ilk kelimesine; imza ve sağlama kalan kelimelere eşit dağıtılır. Bloğun ilk ve son kelimesi mutlaka sembol taşır.
Kapsam
Doğrulayıcı paragraf sınırlarına bakmaz: çerçevenin ilk sembolünü taşıyan kelimeden son sembolü taşıyan kelimeye kadar olan aralık "kapsanan metin"dir.
Sembolleri sırayla oku, kanonik metni yeniden kur, imzayı kontrol et
| Durum | Anlamı | Ne zaman |
|---|---|---|
| Orijinal | Tüm bloklar doğrulandı | Kapsam dışı kelime yok, eksik blok yok |
| Kısmen doğrulandı | Doğrulanan bloklar orijinal | Kapsam dışı kelime, eksik blok ya da çözülemeyen blok var |
| Değiştirilmiş | İmza var, metin uyuşmuyor | En az bir bloğun kanonik metni imzayla eşleşmiyor |
| Bilinmeyen anahtar | İmza kontrol edilemedi | kid güvenilenler listesinde yok |
| Hasarlı | Semboller var, blok yok | Aktarım görünmez karakterlerin bir kısmını bozmuş |
| Filigran yok | Doğrulanamaz | Hiç görünmez karakter yok; sahtelik kanıtı değildir |
Açık anahtar alan adınızda durur
Doğrulama için yalnızca yayıncının açık anahtarı gerekir. Yayıncı anahtarlarını /.well-known/jettymark.json adresinde yayınlar; doğrulayıcı bir kez indirir, sonra tamamen çevrimdışı çalışır. Aynı anahtar metni, görseli ve videoyu imzalar.
Anahtar kimliği (kid) açık anahtarın SHA-256 özetinin ilk 4 baytıdır. Anahtar sızarsa listeye iptal tarihi eklenir; doğrulayıcılar o anahtarla imzalanmış içeriği "bilinmeyen anahtar" olarak raporlar.
Ne olur, ne olmaz
Dürüst bir mühür, sınırlarını da söyler. Aşağıdaki tablo metin filigranı için gerçek testlerden alınmıştır.
| Müdahale | Sonuç | Açıklama |
|---|---|---|
| Bir rakam değiştirilir (12 → 21) | Değiştirilmiş | İlgili blok "imzayla uyuşmuyor" olarak işaretlenir |
| Kelime, görünmez diziyle birlikte silinir | Kısmen doğrulandı | Blok çözülemez ama başlık sağlaması sayesinde belgeye ve blok numarasına atfedilir |
| Sona cümle eklenir | Kısmen doğrulandı | Eklenen cümle "kapsam dışı" olarak listelenir |
| İşaret başka bir metne taşınır | Değiştirilmiş | İmza kanonik metnin özetine atıldığı için düşer |
| Yeniden satırlama, akıllı tırnak, NBSP, NFD | Orijinal | Kanonikleştirme bunları yok sayar |
| Görünmez karakterlerin tümü silinir | Filigran yok | Sahte değil, doğrulanamaz; kayıt defteri benzerlikle bulur |
| Yazdırma, OCR, ekran görüntüsü (metin) | Filigran yok | Metin mührü metnin kendisinde; görüntüye geçmez. Görsel ve video için 12. bölüme bakın |
Piksellerde yaşayan mühür, altı adımda.
Fotoğrafta ve videoda kelime sonu yoktur; mühür, görüntünün parlaklığına eklenen çok zayıf bir desendir. Aşağıdaki bölümler bu desenin neyi taşıdığını, içeriğe nasıl bağlandığını ve nasıl okunduğunu anlatır. Format belgesi: FORMAT-MEDIA.md. Dayanıklılık rakamları tasarım hedefidir; ölçüm sürüyor.
128 piksellik karo, iki katman
Görüntü önce uzun kenarı 1024 piksele indirilen bir "çalışma çözünürlüğü"nde ele alınır. Bu çözünürlükte 128×128 piksellik tek bir karo üretilir ve görüntünün tamamına döşenir: her karo aynıdır. Karo, yalnızca parlaklığa (Y) eklenir; renk ve dosya biçimi değişmez.
Karonun frekans uzayı iki mantıksal katmana ayrılır: düşük frekanslı kimlik katmanı (C) 64 bitlik işaret kimliğini taşır ve kameradan, baskıdan, 480p videodan okunacak kadar sağlamdır; daha yüksek frekanslı imza katmanı (F) 120 baytlık imzalı çerçevenin tamamını taşır ve yalnızca dosya yolundan okunur. 96 "senkron" bini de geometriyi bulmaya ve yanlış pozitifleri elemeye yarar.
Bir algısal maske, deseni düz alanlarda (gökyüzü, ten) kısar, dokulu alanlarda büyütür. Güç 1–5 arasında seçilir; varsayılan 3'te tasarım hedefi yaklaşık 42 dB PSNR'dir. İmzalayan, çıktısını JPEG kalite 60 ve %50 küçültme ile kendisi dener; desen çözülemiyorsa gücü artırır ya da reddeder ("görüntü filigran taşıyamıyor"). Sessizce zayıf mühür basılmaz.
| Bileşen | Bant (karo başına devir) | Taşıdığı | Dayanması hedeflenen |
|---|---|---|---|
| S · senkron | 4 ≤ r < 12 (96 bin) | Sabit fazlar | Kimlik katmanının dayandığı her şey; çeviri ve yön bilgisi |
| C · kimlik | 4 ≤ r < 16 (278 bin) | 88 bit: sürüm, bayraklar, 64 bitlik işaret kimliği, CRC-16 | Kamera 20–50 cm, baskı, 480p video, ağır yeniden kodlama |
| F · imza | 16 ≤ r < 36 (1628 bin) | 120 baytlık imzalı çerçeve | JPEG kalite ≥ 60, 0,5× / 2× boyut, %60 kırpma, ±5°, ekran görüntüsü, x264 CRF ≤ 23 |
Tüm binler, fazlar ve permütasyonlar herkese açık sabitlerden türetilir (xoshiro128**, amaç dizgileri). Her iki katman K=7, hız 1/2 evrişimsel kodla korunur; çözümde yumuşak kararlı Viterbi kullanılır. Son sütun tasarım hedefidir: Hedef · ölçüm sürüyor.
Her görselde, her 2 saniyelik parçada 120 bayt
Başlık; yayıncı anahtarının kimliğini, belge kimliğini, zamanı, alıcıyı, video parçasının numarasını, imzalı alanın boyutunu ve 25 baytlık içerik özetini taşır. Ardından 64 baytlık Ed25519 imzası ve sağlama gelir. İmzalanan mesaj "JMM1" ‖ başlık; içerik özeti başlığın içinde olduğundan imzaya ayrıca bir şey eklenmez.
İşaret kimliği
SHA-256("JMM1-ID" ‖ kimlik öneki)[0..8]: sürüm, bayraklar, kid, belge kimliği, zaman ve alıcıdan türetilen 64 bit. Yayınlanan her kopyanın kendi kimliği vardır; bir videonun her parçası aynı kimliği taşır.
Video parçaları
Sunum zamanına göre her 2 saniye bir parça; parçanın her karesi aynı çerçeveyi taşır. 4 saniyeden uzun her kesit en az bir tam parça içerir; çözülen parça numarası kesitin yayındaki yerini söyler.
Metinle ortak olanlar
Anahtarlar, kid, belge kimliği, alıcı parmak izi, güven listesi ve altı sonuç kelimesi metinle aynıdır. Metin çerçevesi (TMK1, 87 bayt) değişmez; medya çerçevesi ayrı bir formattır.
İmza görüntünün özetine atılır
Metinde imza kanonik metne atılır; görüntüde kanonik metnin karşılığı 25 baytlık bir içerik özetidir (JMQ-25): imzalı alan 8×6 = 48 bölgeye bölünür ve her bölgenin parlaklık düzeyi 16 basamaktan birine yuvarlanır. Özet, mührün yaşadığı ince dalga boylarından çok daha kaba yapıya bakar; bu yüzden yeniden sıkıştırma, boyutlandırma ve ılımlı ton değişiklikleri özeti değiştirmez, bir bölgenin içeriğini değiştirmek değiştirir.
Doğrulayıcı aynı 48 düzeyi alınan görüntüde yeniden ölçer, imzadaki düzeylere sağlam bir ton eğrisi oturtur (parlaklık, kontrast ve gama değişiklikleri böylece emilir) ve eğriden 10 gri düzeyden fazla sapan bölgeleri "imzayla uyuşmuyor" olarak işaretleyip görüntünün üstünde gösterir. Doygun (tamamen beyaz ya da siyah) bölgeler karşılaştırmadan dışlanır.
Dürüst sınır: denetim bölge ölçeğindedir (bir bölge alanın yaklaşık %2'si). Bir bölgenin parlaklık düzeyini koruyan değişiklikler (aynı parlaklıkta renk değişikliği, küçük bir alanın bulanıklaştırılması ya da rötuşlanması) çevrimdışı yakalanmayabilir; 48 düzeyi herkes okuyabildiği için bilerek bu toleransın içinde tutulan bir düzenleme de yakalanmaz. Kayıt defteri her 128 piksellik karonun özetini saklar ve çevrimiçi karşılaştırır.
İmzalı alan (son 8 piksel hariç) 8×6 bölgeye bölünür; her bölgede parlaklıkların orta yarısının ortalaması alınır ve 4 bite yuvarlanır. Basamak boyu görüntünün parlaklık aralığına göre seçilir ve 1 baytta saklanır.
Doğrulayıcı imzadaki düzeylerden alınan görüntünün düzeylerine kübik bir ton eğrisi oturtur; aykırı bölgeler eğriyi etkilemez. Kırpılmış görselde yalnızca tam görünen bölgeler karşılaştırılır.
| Karşılaştırma | Durum | Sonuca etkisi |
|---|---|---|
| Karşılaştırılan her bölge ton eğrisine 10 gri düzey içinde uyuyor | uyuşuyor | Orijinal (kapsam tamsa) / Kısmen (kırpılmışsa) |
| En az bir bölge eğriden 10 gri düzeyden fazla sapıyor | uyuşmuyor | Değiştirilmiş; bölgeler işaretlenir |
| 8'den az bölge karşılaştırılabildi (ağır kırpma, doygun görüntü) | belirsiz | Kısmen doğrulandı · "belirsiz" |
Geometriyi bul, karoyu katla, iki katmanı çöz, imzayı ve özeti kontrol et
| Durum | Anlamı | Ne zaman |
|---|---|---|
| Orijinal | İmza geçerli, içerik uyuşuyor | Görüntünün tamamı görünüyor, 48 bölge imzayla uyuşuyor |
| Kısmen doğrulandı | Görünen kısım orijinal | Kırpılmış (kapsam < 1), kesilmiş video, ya da karşılaştırma belirsiz · kırpılmış / belirsiz |
| Değiştirilmiş | İmza var, görüntü uyuşmuyor | En az bir bölgenin özeti imzadakiyle eşleşmiyor; bölgeler işaretlenir |
| Bilinmeyen anahtar | İmza kontrol edilemedi | kid güvenilenler listesinde yok ya da iptal edilmiş |
| Hasarlı | Senkron var, çerçeve yok | Hiçbir katman çözülemedi; ya da yalnızca kimlik: kimlik katmanı okundu, imza katmanı çözülemedi — kayıt defterine sorulabilir; ya da imza geçersiz (bozuk ya da uydurma başlık; yayıncı adı asla iddia olarak gösterilmez) |
| Filigran yok | Doğrulanamaz | Kafes yok ya da senkron kapısı geçilemedi; sahtelik kanıtı değildir |
Metinden bilinçli bir fark: metinde geçersiz imza "değiştirilmiş" demektir (imza metni kapsar); görüntüde imza yalnızca başlığı kapsar, bu yüzden geçersiz imza "hasarlı"dır ve içerik değişikliğini yakalayan şey içerik bağlamasıdır. Yanlış pozitif için zincirli kapılar: 7σ senkron eşiği, CRC-16, CRC-8, sürüm baytı ve imza. Hedef: 1000 işaretsiz görüntüde 0 "hasarlı" ya da üstü (hedef · ölçüm sürüyor).
Kamera tanımlar, dosya doğrular
Telefon kamerası ekrana ya da baskıya 20–50 cm'den tutulduğunda, bulanıklık ve perspektif yüzünden kare başına yalnızca birkaç güvenilir bit okunur; 512 bitlik imza ve başlığı bu yoldan taşımak dakikalar alırdı. 64 bitlik kimlik 1–3 saniyede okunur. Bu yüzden kamera yolu kayıt defterine sorar: "bu işaret kime kayıtlı?"
Sonuç bir doğrulama değildir ve öyle adlandırılmaz: uygulama TANIMLANDI der, "doğrulandı" demez. Kimlik katmanı imzasız ve herkese açıktır; bilinen bir kimlik başka bir görsele kopyalanabilir. Kayıt defteri, telefonun gördüğü içerik özetini kayıtlı olanla karşılaştırır ve uyuşmazlığı söyler; yayıncı izin verdiyse kayıtlı küçük resmi de gösterir. İmzanın kendisi yalnızca dosya yüklenerek doğrulanır.
Telefondan yalnızca işaret kimlikleri ve en fazla 128 bitlik özet gider; görüntü, kare ya da konum gönderilmez. Kayıt defterine ulaşılamazsa uygulama "kayıt defterine ulaşılamadı — kimlik: …" der; asla bir iddiaya dönüşmez.
Ne gönderilir
İşaret kimlikleri (en fazla 4), isteğe bağlı 64+64 bitlik özet ve görünen bölge maskesi, güven ölçütleri. Görüntü, kare ve konum gönderilmez; cihaz kimliği saklanmaz.
Neden çevrimiçi
Kamera 64 bitlik kimliği taşır, imzayı değil. 64 biti bir yayıncıya ve içeriğe yalnızca kayıt defteri eşler. Telefonda imza katmanı da fırsat düştükçe denenir; çözülürse çevrimdışı doğrulama ayrıca bildirilir, vaat edilmez.
Sınırlar
20–50 cm, ±15° eğim; moiré ve çok düz görüntüler okumayı zorlaştırır. Baskıda yalnızca kimlik katmanı okunur. Bu değerler tasarım hedefidir.
| Kayıt defteri karşılaştırması | Uygulamanın söylediği |
|---|---|
| uyuşuyor | "TANIMLANDI — Bu işaret şu içeriğe kayıtlı: … · yayıncı: Ege Haber Ajansı. Gördüğünüz görüntü kayıtla uyuşuyor (kamera karşılaştırması, yaklaşık)." |
| uyuşmuyor | "DİKKAT: Bu işaret şu içeriğe kayıtlı: … · yayıncı: Ege Haber Ajansı. Ama gördüğünüz görüntü o kayıtla uyuşmuyor — işaret başka bir görsele kopyalanmış olabilir." |
| bilinmiyor | "TANIMLANDI — Bu işaret şu içeriğe kayıtlı: … · yayıncı: Ege Haber Ajansı. İçerik kameradan karşılaştırılamadı — doğrulamak için dosyayı yükleyin." |
| kayıt yok | "Bu işaret kayıt defterinde yok (kimlik …)." |
Neye dayanması hedeflenir, neye dayanmaz
Aşağıdaki satırlar formatın tasarım hedefleridir. Her satır, test külliyatında ölçüldükçe 'ölçüldü' olarak işaretlenecek; o güne kadar hiçbiri bir vaat değildir.
| Müdahale (görsel) | Hedeflenen sonuç | Açıklama | Durum |
|---|---|---|---|
| JPEG yeniden sıkıştırma, kalite ≥ 60 | Orijinal | 40 gerçek fotoğrafta ölçüldü; zayıf kalan görsellerde imzalarken güç otomatik artırılır | Ölçüldü |
| %50 küçültme | Orijinal | 1200 px ve üstü orijinallerde imza katmanı çözülür; 768 px ve altında yalnızca kimlik katmanı okunur | Ölçüldü |
| 2× büyütme | Orijinal | Doğrulayıcı dosyayı 1024 px'e indirir; döşeme periyodu yeniden bulunur | Ölçüldü |
| %60 kırpma | Kısmen doğrulandı | "Kırpılmış": görünen bölgeler doğrulanır, kapsam bildirilir; kırpmaların yaklaşık %80'inde imza çözülür, kalanında yalnızca kimlik okunur ya da filigran bulunamaz — yanlışlıkla "değiştirilmiş" denmez | Ölçüldü |
| ±5° döndürme | Orijinal | Döşeme kafesi otokorelasyonla yeniden bulunur; görsellerin yaklaşık %90'ında imza çözülür, kalanında yalnızca kimlik okunur | Ölçüldü |
| Sosyal medya yeniden sıkıştırması (1080 px, JPEG 75, meta veri silinmiş) | Orijinal | Benzetimle ölçüldü (yeniden boyutlandırma + JPEG 75) | Ölçüldü |
| Ekran görüntüsü | Orijinal | Benzetimle ölçüldü (%83 ölçek + JPEG 85) | Ölçüldü |
| Alanın %6'sı ya da daha büyük bir bölgenin içeriği değiştirilir (başka fotoğraftan parça, nesne ekleme, boyama) | Değiştirilmiş | 40 gerçek fotoğrafta ölçüldü: 4×4 hücrenin değiştirilmesi %97,6, %6'lık parça %96,9, %10 nesne ekleme %99,8, %6 kırmızı yama %93 oranında "değiştirilmiş" (imza katmanının çözüldüğü örneklerde; çözülmeyenler "değiştirilmiş" yerine "hasarlı" ya da "filigran yok" okunur, hiçbiri "özgün" değil). Ortalamadır: düz, az dokulu görsellerde %6'lık değişikliklerin beşte biri ile yarısı arasında kaçabilir. Zararsız işlemlerde 2224 örnekte 0 yanlış alarm; siyah-beyaza çevirme bir görselde yanlışlıkla "değiştirilmiş" verdi. Küçük rötuş, bulanıklaştırma (%6'da %7) ve aynı parlaklıkta renk değişikliği çoğu zaman yakalanmaz | Ölçüldü |
| İşaret başka bir görsele taşınır | Değiştirilmiş | İmza, içerik özetini kapsar: taşınan işaret yeni görselle uyuşmaz | Ölçüldü |
| Kasıtlı silme (desen çıkarma, ağır bulanıklaştırma, çok düşük kalite) | Filigran yok | Mühür silinebilir; sonuç "filigran yok"tur, asla "sahte" değil | Hedef · ölçüm sürüyor |
| Müdahale (video) | Hedeflenen sonuç | Açıklama | Durum |
|---|---|---|---|
| x264 CRF ≤ 23, 720p ve üstü | Orijinal | İmza katmanı her 2 saniyelik parçada çözülür | Ölçüldü |
| x264 CRF ≤ 28 ya da 480p | Orijinal | 720p CRF 28 ve 480p CRF 23'te tüm parçalar doğrulandı; 480p + CRF 28'de kısmen doğrulandı | Ölçüldü |
| Kesme (≥ 4 sn'lik herhangi bir klip) | Kısmen doğrulandı | En az bir tam parça çözülür; parçanın yayındaki yeri bildirilir | Ölçüldü |
| Kare hızı dönüşümü, kare düşürme | Orijinal | 15, 24 ve 30 fps dönüşümlerinde ölçüldü | Ölçüldü |
v1'de bilerek vazgeçilenler: kafesin verdiği 8 yön ve yaklaşık ±15° dışında rastgele döndürme, alanın %50'sinin altında kırpma, ~15° üstü perspektif, arşiv kalitesinde baskı-tarama, çevrimdışı bölge altı düzenleme tespiti, kamera yolunda çevrimdışı sahiplik cevabı ve kasıtlı silmeye karşı her türlü direnç. Silinmiş işaret ile hiç işaretlenmemiş dosya aynı görünür.
Kendi doğrulayıcınızı yazmak ister misiniz?
İki format belgesi de bağımsız bir uygulama için yeterlidir; referans kütüphane ve test vektörleri açık kaynak.