29 Mart 2010 Pazartesi

STEGANOGRAPHY - ( Steganografi )

  Bitirme projemi Steganografi alanında aldım. Bir yıl öncesinden başlamıştım düşünmeye aslında, uğraşırken haz duyacağım ve bana katkı sağlayabilecek bir proje almayı çok istiyordum. Aklımda yapay sinir ağları ile alakalı bir kaç proje belirlemiştim. Onlardan biri plaka tanıma sistemi idi. Çok ilgimi çeken bir konuydu ve bitirme projemi onun üzerine almak istiyordum. Sayın hocam Yrd. Do. Dr. A. Bedri ÖZER ile bitirme hakkında konuşmak için gittiğimde bana steganografi den bahsetti. Daha önce hiç duymamıştım ancak anlattığı kadarıyla ilgimi çekmişti. Bende 1 gün süre istedim ve araştırmalar yaptım. İşte budur abi, dedim biraz araştırma yaptıktan sonra . Projeye başlamak için sabırsızlanıyordum gerçekten. Sabah erkenden gidip projeyi almak istiyordum, hocamın benden önce konuyu başka birisine verecebileceğinden bile korktum :D
O derece ilgimi çekmişti çünkü....

  Projeye başlamdan önce resim formatları hakkında araştırmalar yaptım. Daha sonra oluşurduğum deneme projesi üzerinde çalışmalara başladım...

  Steganografiden bahsetmeden projeye geçilmez heralde :)
Steganografi yi kısaca veri saklama sanatı olarak özetleyebiliriz. Steganografi için genelde resim, video ve müzik dosyaları taşıyıcı olarak kullanılıyor. Taşıyı dosya, gizli veriyi içeren dosya ya verilen isimdir. Bu dosyaya ayrıca stego dosyada denilmektedir.

  Stego dosya ya veri saklamak için birden fazla yöntem vardır. Bunlardan en yaygın kullanılanı ise LSB( Lowest Significant Bit ) yöntemidir. Projemde stago dosya olarak resim dosyalrını seçtim. Ve yöntem olarakta LSB yöntemini kullandım.

  LSB yöntemine göre , her byte ın son biti kullanılmak için tahsis edilir. Dosyaya saklanacak karakterler in binary hali elde edildikten sonra, her byte ın son biti ne sırasıyla karakterkerin binary karşılıları saklanır. Burada , bu yöntemi güzel yapan nokta şudur: Örneğin, eğer sıradaki saklancak bitimiz '0' ise ve değiştireceğimiz bitimizde aynı şekilde '0' ise , hem verimizi saklamış olacağız, hemde orjinal bitimiz değişmemiş olacaktır. Kaldı ki, bitimizin değişmesi durumuda bizim için çok önemli olmayacaktır. Çünkü son bitteki bir bitlik değişim için gözle görünecek bir renk farklılığı oluşmayacaktır. Yani kullandığımız tüm son bitler değişse bile ve hatta resimdeki tüm byte lerı kullansak dahi resim stego resmimiz ile orjinal resmimiz arasında insan gözünün algılayacağı bir frekans farklılığı meydana gelmiycektir. böylece stego resim verimizi başarıyla kamüfle edecektir...

  Bu kadar edebiyattan sonra yavaş yavaş projeye geçebilirz galiba.. Burada projenin tüm kodalrını verecek kadar paylaşımcı bir insan değilim :P

  Bu arada projemi .Net te c# kullararak yaptım ve .Net te bu iş için hazır kütüphanelr olduğunu öğrendim. Ancak bu kütüphanelere elimiz bile sürmedim :P
Yani el emeği göz nuru oldu diyebiliriz.. :) Burada sadece karşılaştığım sorunlardan bahsedeceğim ve projenin ekran görüntülerini vereceğim. Ayrıca bir orjinal resim ile stego resmide beraber vererek, az önce bahsettiğimiz bozulmaların ne denli farkedilemeyecek olduğunuda göreceğiz. Öncelikle sade görünümlü ara yüzümüzü görelim:



  Görüldüğü gibi iki adet tab page imiz var. Bunlardan biri verimizi saklamak diğeri ise tekrar elde etmek için kullanılıyor. Sağ üst köşede Dosya Aç butonu ile açtığımız resme ait bilgiler görüntülenmektedir. Karakter kapasitesi ile belirtilen kısıma seçilen resim için saklanabilecek maksimum karakter sayısı yazılmaktadır.


  Örnek bir saklma işleminden sonra ise arayüzümüz aşağıdaki bigi olmaktadır:





  Şuan form üzerinde görüntülenen resim aslında orjinal resim değildir. Yani stego resmimizdir, bu resmi Kaydet butonu ile bir dizine kaydetmeliyiz. Kayıt işleminden sonra Çıkar sekmesine gelerek kaydettiğimiz bu stego resmimizi seçtikten sonra Çıkar butonuna basmamız halinde ise görüldüğü üzere veriler okunarak metin kutusuna yazılmış olacaktır:




  Görüldüğü gibi saklanan karakter sayısı ve okunan karakter sayısı eşittir. Buda herhangi bir veri kaybımızın olmadığını gösterir. Bunu anlamak için çıkarılan metnimizide kontrol edebiliriz tabiki.. Bir başka değinilmesi geeken nokta ise, işelem süreleridir. Görüldüğü gibi saklama işlemimiz okuma işleminden daha fazla zaman almıştır. Aradaki zaman farkı saklanan karakter sayısı ile doğru orantılıdır.

  Veri saklama işleminde karşılaştığım bir sorunu paylaşmak isterim; Saklam işleminde karakterlerin binary karşlığı için ASCII standardını kullandım. Bu standartta Türkçe karakterlerin karşılığı yoktur. Aslında var.. Bir Türkçe karakteri ASCII olarak bir text box a yazdırdığım zaman 8 bitlik bir değer gördüm. Halbuki ASCII 7 bitlik bir standart tır? (!) Tüm karakterlerin binary karşılık uzunluğu eşit olmaldıır. Aksi halde saklama ve okuma işlemlerini yapmak mümkün olmaycaktır. Bu sorunu çözmek için bir kaç fonksiyon yazdım. Bilindiği gibi neredeyse hiç kullanılmayan ASCII karakterler vardır. Örneğin 'null' karakteri gibi. Bu karakterin ASCII karşılığı 10 (1010) dur. Bu ve bunun gibi 13 karakteri Türkçe karakterleri kodlamak için kullandım. Böylece Türkçe karakter sorununu adil olmayan yollardan çözmüş oldum ^_^.

  Bir başka önemli sorun ise space( boşluk) karakteri gibi karakterlerin 6 bit ile ifade edilebilmeleridir. Dediğimiz gibi tüm karakterler eşit uzunlukta binary e cevrilmelidirler. (7 - bit). Bu sorunu çözmek ise daha kolay oldu. 6 bitlik karakterlerin başına bir adet '0' biti yerleştirerek bu sorunuda halletmiş oldum. Bu ve bunu gibi ufak tefek sorunlarla boğuşara projemi bitirdim. Orjinal ve stego resim arasındaki 7 farkı bulana kodlarımı verecem :P :D




  Sol: Orjinal Resim        Sağ: 1458 adet karakter içeren taşıyıcı

6 yorum:

Unknown dedi ki...

müdür face'im yok ama bak senin için taa buralara kadar geldim eline sağlık demek için:)

SUADEV dedi ki...
Bu yorum yazar tarafından silindi.
Unknown dedi ki...

Kardeşim proje öncesi ve proje aşamasını gerçekten çok akıcı ve güzel bir uslup ile açıklamışsın.Eline sağlık...

SUADEV dedi ki...

sağol Cebrail, evet biraz samimi bir yazı oldu galiba :))

Unknown dedi ki...

Merhabalar öncelikle yaziniz içten ve aciklayici olmus, paylastiginiz icin tesekkurler.. Paylasali uzin zaman olmuş ama proje elinizde mi hâlâ?

Unknown dedi ki...
Bu yorum bir blog yöneticisi tarafından silindi.