Okulda hocamın bir görselin pixellerine yazının gömülebileceğinden bahsetmesi ile kafamda şimşekler çaktıran proje. Aynı zamanda grafik tasarımı ile ilgilenen birisi olarak duyar duymaz çok etkilendim ve ortaya bir şeyler çıkartmak istedim.

 

Arayüz

 

Program şu şekilde çalışıyor:

Önce görseli seçiyoruz(.bmp 24bit) ve gizlemek istediğimiz yazıyı giriyoruz. Gizle ve Kaydet butonuna tıkladığımızda program gizlenecek yazının harfleri içerisinde bir iterasyon oluşturuyor. Daha sonra bu harfin ASCII kodunu alıp ikilik tabana çeviriyor. Artık elimizde 8 bitlik (örn: A harfi için 01000001) veri var. Bu 8 bit arasında bir iterasyon daha oluşturup sırası ile her biti, sol üstten başlamak kaydıyla görselin ilk pixelinin R bileşeninin LSB(en düşük değerlikli bit(orjinal görsel ile renk farkını minimum seviyeye indirmek için)) sine atıyor. Daha sonra her seferinde bir sağdaki pixel için aynı işlemi yaparak mevcut harfin binary karşılığını görselin ilk 8 pixeline gömmüş olduk. diğer bütün harfleri için uygulayarak yazıyı görsele gömmüş olduk.

Tabi bu yazıyı çözümlerken bir sorunla karşı karşıya kaldım oda gizlenmiş yazı çözümlenirken anlamlı pixel sayısını nerden bileceğim. Bu sorunuda ilk 8 pixelde harf sayısını tutarak hallettim.

 

Tüm bu anlattıklarımın havada kalmaması amacıyla bir örnekle açıklamak istiyorum.

Görselimiz 8×16 pixellik bir bitmap olsun. Standart formatta görseller 24 bittir ve bunun 8 biti kırmızı, 8 biti yeşil, 8 biti mavi renk tonu bilgisini tutar.

Görselimizin ilk 3 pixel satırının kırmızı ton bilgisinin haritası varsayalım şu şekilde olsun:

01001001     10011001     10001001     11100100     10011111     00001110     11001100     11100111

11100111       11001100      11001100      11100100    10001001   01001001    10011001     00001110

01001001     10011001     10001001     11100100     10011111     00001110     11001100     11100111

.                          .

.

 

Yukarıda bahsettiğim gibi her 8 pixele 1 harf gizleyebiliriz. Gizlemek istediğimiz yazı AB olsun

A harfinin ASCII karşılığı 65. 65 in binary karşılığı 01000001. B nin ise 01000010.

Önce harf sayısını ilk 8 pixele gizleyelim(ilk 8 pixel kullanılırsa max 256 harf gizlenebilir. Bu sayı artırılmak için harf sayısını tutan pixel sayısı artırılabilir.)

HARF SAYISI = 2

2 to binary = 00000010 sırası ile ilk 8 pixele işleyelim

ilk değer 0(sıfır) bunu gidip ilk satırın ilk pixelinin LSB sine işleyelim. yani 0100100(LSB = en sağdaki bit) 1 i 0 yapalım.

Artık yazının gizlenmiş olduğu görselde bu pixelin tonu  01001000

Görseldeki renk değişimi insan gözünün ayırt edemeyeceği kadar küçük. Bizzat denedim kesinlikle ayırt etmek mümkün değil.

Bu mantıkla 2 nin binary halinin ikinci değerini (0)  görselin 2. pixeline,

2 nin binary halinin üçüncü değerini (0)  görselin 3. pixeline.. şeklinde hepsini atayalım.

 

Daha sonra A ve B harfleri içinde aynı işlemleri yapalım.

 

Bu mantıkla bütün pixellere aynı işlem yapıldığında artık elimizde 2 aynı görsel ama birisinin içinde yazı gizlenmiş olacak.

 

Gizlenmiş yazıyı çözme işlemini de aynı işlemleri tersten yürütmekle çözdüm.