PHP ve Basit Karıştırma Algoritmaları ile GD Kütüphanesi Kullanarak Resimlerin Kriptolanması

Günümüzde internet altyapısına bağlı olarak güvenlik ön plana çıkmıştır. Verilerin güvenli bir biçimde aktarımı ve elde edilmesi için kriptografi bilimi aracılığıyla çeşitli şifreleme, anahtarlama ve çözümleme algoritmaları kullanılmaktadır.

Kriptoloji, Yunanca krypto’s ve lo’gos kelimelerinin birleşmesinden oluşmuştur. Günümüzde ise daha çok gizlilik bilimi olarak değerlendirilmektedir.

Ticari ilişkilerde, devlet işlerinde, askeri işlerde güvenlik ön planda tutulmaktadır. Bu işlerde iki nokta arasındaki iletişimde verinin güvenli bir şekilde gittiğinden emin olmak gerekir. Bunun sağlanması ise verinin şifrelenmesi ile olur. Şifreleme ile yetkisiz kişiler tarafından dinleme, veriyi bozma ya da değiştirme gibi problemlerin önüne geçilir. Böylece açık bir şekilde yapılan iletişim güvenli bir şekilde gerçekleşmiş olur.

Resim Kriptolamada Temel Kavramlar

Bir resmin anlaşılabilirliğini gizlemek için iki yöntem kullanılabilir. Bunlardan biri resmin belirli bir yöntem ile kısaltılması diğeri ise resmin anlaşılamayacak hale gelecek şekilde karıştırılmasıdır.

Resmin orijinal haline açık resim denir. Açık resmin şifrelenmiş haline şifrelenmiş, gizlenmiş ya da kriptolanmış resim denir. Resmin anlaşılamaz hale gelmesine şifreleme ya da kriptolama denir. Şifrelenmiş resmin tekrar açık resim haline getirilmesine de kriptolama ya da şifre çözme denir. Resim şifrelenirken ve şifre çözülürken kullanılan bilgiye anahtar denir. Şifrelenmiş bir resmin şifresini çözebilmek için anahtar bilgisine sahip olmak gerekir. Bundan dolayı şifreyi çözmek isteyen birinin sadece şifreleme algoritmasını bilmesi yeterli olmaz. Şifreyi çözmek isteyen birinin şifreleyen kişiden anahtarı alması gerekir. Anahtar elinde olmazsa şifreyi çözemez. Bu da güvenliği daha üst düzeye çıkartır.

1

Kriptolama İşleminin Şematik Gösterimi

GD Kütüphanesi ve Resim İşleme Hakkında Temel Bilgiler

GD kütüphanesi, resim işleme amaçlı kullanılan bir ANSI C kütüphanesidir. Boutell.com tarafından açık kaynak kodlu olarak geliştirilmekte ve dağıtılmaktadır. PHP’de GD fonksiyonlarının kullanılabilmesi için, PHP derlenirken GD kütüphanesinin de derlenmesi gerekir. PHP 4.3 versiyonundan itibaren bütünleşik bir GD Kütüphanesi PHP ile derlenmektedir. Dolayısıyla PHP 4.3 ve sonrası için ayrıca bir GD Kütüphanesi yükleme gereksinimi yoktur.

GD kütüphanesi sayesinde PNG, JPEG, GIF, BMP, XMP formatındaki resimler işlenebilir. Ayrıca bu formatlarda sıfırdan resim üretilebilir. Resimlerin çözünürlük, derinlik gibi özelliklerinde oynama yapılabilir. Varolan resimlere çeşitli ögeler eklenebilir.

GD kütüphanesi günümüzde istatistik, güvenlik kodu, barkod, resim küçültme ve büyütme, resim bilgileri alma, sanal damgalama gibi birçok alanda kullanılmaktadır. Kısaca GD kütüphanesi, yüz üç fonksiyondan oluşan, altıdan fazla resim formatı destekleyen, PHP kullanıcıların sıkça kullandığı, çok kullanışlı bir resim işleme kütüphanesidir. Bu fonksiyonları kullanımı yöntem bölümünde ayrıntılı olarak anlatılmaktadır.

Kriptolama ve Dekriptolama Algoritmasının Belirlenmesi

Şifrelemenin işlevini güvenli bir şekilde gerçekleştirmesi kriptolama sırasında kullanılan tüm yöntem ve bilgilerin gizliliğine bağlıdır. Ancak herhangi bir nedenle kripto algoritmasının açığa çıkabileceği düşünülerek iletişim güvenliği kripto anahtarı denen ek bilgi ile artırılmıştır. Bu durumda kriptolama işlemi sırasında açık resim, kripto anahtarı aracılığıyla şifrelenir. Yani açık resim ile kriptolanmış resim arasındaki geçişler kripto algoritmasına bağlı olduğu kadar kullanılan kripto anahtarına da bağlıdır.

Yazılan programda simetrik ve asimetrik kriptolama algoritmalarından simetrik kriptolama algoritması kullanılmıştır. Yani resim kriptolanırken kullanılan anahtar ile resim dekriptolanırken kullanılan anahtar aynıdır. Asimetrik algoritma seçilmemesinin bir kaç nedeni bulunmaktadır. Öncelikle bunların güvenliğini sağlamak için çok büyük aslan sayılar kullanılmaktadır. Bu da zaman açısından çok büyük problem oluşturmaktadır. Asimetrik algoritmalarda anahtar üretmek için ikinci bir algoritmaya ihtiyaç duyulur. Simetrik algoritmada tek anahtar kullanıldığı için böyle bir sorun oluşmaz. Bu faktörler asimetrik algoritmanın çalışmasını yavaşlatmaktadır. Asimetrik algoritmalardan yüksek verim elde etmek için yüksek performanslı sunuculara ihtiyaç vardır. Simetrik algoritmalar hemen her sunucuda sistemi zorlamadan çalışabilir. Bu nedenlerden dolayı asimetrik kriptolama algoritması yerine simetrik kriptolama algoritması kullanılmıştır. Aşağıdaki iki şemada kripto algoritması (solda) ve dekripto algoritması (sağda)şematik olarak gösterilmiştir.

2

Basit Kriptolama Algoritmasının Şematik Gösterimi (Akış Diyagramı Değil)

Açık resim program girişinden girer. Şifrelenmek için gerekli kontroller ve düzenlemeler yapılır. Resim şifrelenecek hale geldikten sonra resimdeki her pixelin bilgileri matrisler halinde alınır. Matrisler girilen kripto anahtarına göre iki kez karıştırılır. Karıştırılan matrislerin her birinin renk kodları (RGB) alınır ve kripto anahtarına göre karıştırılır. Daha sonra resmi dekriptolamak için kullanılacak çözüm anahtarı üretilir. Şifrelenmiş resim çıktısı kaydedilir. Böylece şifreleme işlemi tamamlanmış olur.

Belirlenen Algoritmaya Uygun Kodların Yazılması

GD kütüphanesi, girişte belirtildiği gibi, yüz üç adet fonksiyondan oluşan bir kütüphanedir. Bu kütüphane PHP ile var olan bir resmi düzenleme, yeni bir resim oluşturma, grafik ve şekil çizme, resmi yeniden boyutlandırma gibi işlemler rahatlıkla yapılabilmektedir. GD kütüphanesi PNG, GIF, JPEG formatları başta olmak üzere altıdan fazla resim formatını desteklemektedir.

GIF (Graphics Exchange Format): Oldukça eski ve kayıpsız sıkıştırma kullanan bir dosya formatıdır. Sıkıştırma algoritmasındaki patent sorunları nedeniyle giderek daha az kullanılmaktadır. Birden fazla kareden oluşan animasyon içerebilir. Ayrıca şeffaflık desteği bulunmaktadır. Palet bazlı bir bitmap dosya formatıdır.

JPEG (Joint Picture Experts Group): Kayıplı sıkıştırma kullanan yaygın bir dosya formatıdır. Sıkıştırma oranı ve kalitesi ayarlanabilir. Fotoğraf gibi yüksek renkli resim dosyalarında daha iyi sonuçlar verir. Bilgisayar ile üretilmiş resimlerde çok fazla kullanılmaz ve tavsiye edilmez. Webde kullanılan en yaygın formattır. Gerçek renkli bitmap formatıdır.

PNG (Portable Graphics Format): GIF ve PNG’ye göre daha yeni bir formattır. Kayıpsız sıkıştırma kullanır. Şeffaflık desteği vardır. GIF yerine yaygın olarak kullanmaya başlanmıştır. Palet bazlı veya gerçek renkli resimlere izin verir. Dosya boyutu açısından GIF ve JPEG’den karlıdır.

Yukarıda en çok kullanılan üç resim formatının kısaca özellikleri anlatılmıştır. Bu formatların özellikleri dikkate alındığında PNG formatının JPEG formatının aksine şeffaflık desteği bulunur. PNG formatının diskte kapladığı alan JPEG formatına göre azdır. PNG ve GIF formatlarının her ikisi de sıkıştırmada başarılıdır. Ama GIF formatı sadece palet bazlı resimlere izin verirken PNG formatı hem palet bazlı hem de gerçek renkli resimlere izim verir. Ayrıca GD kütüphanesinin PNG işleme performansı GIF ve JPEG formatlarına göre daha başarılıdır. Bu nedenlerden dolayı kriptolanacak resim formatı PNG belirlenmiştir.

Kriptolanacak resim türü ve kripto algoritması belirlendikten sonra bunlara uygun program kodlanmaya başlandı. Program kodlanırken GD kütüphanesinin yüz üç adet fonksiyonundan PNG formatını işlemeye yarayan yirmi fonksiyon kullanıldı.

Hazırlanan algoritmada ilk olarak resim boyutlarının eldesi yer almaktadır. Resim boyutları GD kütüphanesinde yer alan “getimagesize()” fonksiyonu ile elde edilir. Bu fonksiyon bir resmin boyutlarını döndürür ve

array getimagesize(string $resim);

şeklinde kullanılır.Resmin boyutları $array [‘0’] ve $array[‘1’]  şeklinde alınır. $array[‘0’] resmin genişliğini $array[‘1’]  resmin yüksekliğini döndürür.

İkinci aşama olarak matrislerin elde edilmesi gerekmektedir. Sayısal görüntüler satır ve sütunların bir araya getirilmesiyle oluşan ve pixel olarak tanımlanan küçük karelerden oluşur. Bunlara nokta denir ve her nokta bir görüntünün ya da grafiğin çözünürlüğünde önemli bir yer tutar. Kaliteli olarak tanımlanan görüntüler daha fazla noktanın bir araya gelmesi ile oluşur. En küçük görüntü birimi olan pixellerin filtrelenmesi ve dönüştürülmesi için çeşitli hesaplamalar yapılır. Bu hesaplamalarda matrislerden yararlanılır. Bir matris satır ve sütunlardan oluşur. Bu satır ve sütunlar koordinat sistemindeki (x,y) ile aynıdır.

Matrislerin elde edilmesi her bir satır ve sütunda bulunan pixellerin RGB renk kodlarının tek tek elde edilmesiyle olur. Her bir satır ve sütuna ulaşmak için iç içe iki adet for() döngüsü kullanılır. Birinci döngü yüksekliği yani y koordinatını, ikinci döngü ise genişliği yani x koordinatını elde eder. Kurulan bu ili döngü ile sırayla her pixelden tek tek geçilir.

Geçilen her matrisin RGB değerlerinin elde edilmesi gerekir. Bunun için GD kütüphanesinden “imagecolorat()” fonksiyonu kullanılır. Bu fonksiyon belirtilen matrisin RGB değerlerini yani renk indisini döndürür. Renk inidisi Red, Green, Blue değerlerine karşılık gelir. Türkçe ifadesiyle bir matrisin renk değeri Kırmızı, Yeşil, Mavi değerleriyle belirlenir. Bu değere “imagecolorat()” fonksiyonuyla ulaşılır. Bu fonksiyon

     int imagecolorat(resource $resim, int $x, int $y);

şeklinde kullanılır. $x değeri genişliği, $y değeri yüksekliği ifade eder. Örnek olarak

     imagecolorat($im, 98, 24);

kodu seçilen resmin (98,24) matrisindeki pixelin renk indisini döndürür. İç içe kullanılan for() döngüsü ve bu döngülerin içinde kullanılan imagecolorat() fonksiyonu ile her pixelin renk indisi tek tek alınmaktadır.

Şifreleme işlemi yapılırken matrisler karıştırılır. Matrisler karıştırılırken 900, 1200, 1800 döndürme, x eksenine veya y eksenine göre yansıması alınabilir. Diğer bir yöntem olarak matrisler tek tek taşınabilir. Matrislerin çeşitli açılarla döndürülmesi ile oluşan yeni şekilde resmin görüntüsünün kalitesinde önemli derecede azalma olur. Bu yüzden matrislerin döndürülmesi yerine matrisler tek tek taşınır. Matrislerin taşınmasında kalite kaybı olmaz.

3

5×5 Piksellik Bir Resim

4

5×5 Piksellik Bir Resmin Yapısı ve Resmi Oluşturan Pikseller

GD kütüphanesinde bir matrise eklenecek renk “imagecolorallocate()” fonksiyon ile tanımlanır. Eğer bir matrise bir renk değeri atanacaksa atanacak olan bu renk değeri bu fonksiyonla belirtilir. Bu fonksyion

     imagecoloralllocate(resource $resim, int $r, int $g, int $b);

şeklinde kullanılır. $r, $g, $b değişkenleri rengi belirleyen kırmızı, yeşil, mavi renk kodlarını tanımlar. Bu üç değer bir araya gelerek bir matrisin renk değerini belirtir.

Matrise tanımlanacak renk değeri belirlendikten sonra bu renk değeri belirlenen matrise eklenir. Matrise ekleme işlemi “imagesetpixel()” fonksiyonuyla yapılır. Bu fonksiyonun görevi imagecoloralllocate() fonksiyonu ile tanımlanan renk değerini belirlenen matrise eklemektir. Bu fonksiyon

     imagesetpixel(resource $resim,  int $x, int $y, $renk);

şeklinde kullanılır. Fonksiyonda $x matrisin genişliğini, $y yüksekliğini ifade eder. $renk, imagecolorallocate() fonksiyonu ile belirlenmiş renk değeridir. Burada dikkat edilmesi gereken önemli husus $renk değişkeninin imagecoloralllocate() fonksiyonu ile belirlenmiş olmasıdır.

Buraya kadar yapılan işlemler matris okuma  ve taşıma işlemlerini oluşturmaktadır. Bu noktadan sonra yapılması gereken tek şey oluşturulan resmin çıktısının alınmasıdır. Resmin çıktısının alınması “imagepng()” fonksiyonu ile yapılır. Bu fonksiyon

     imagepng(resource $resim, resource $cikti);

şeklinde kullanılır. $resim daha önceden çeşitli işlemlere tabi tuttuğumuz resim, $cikti ise bu resmin kaydedileceği dosya adıdır.

Arayüz Tasarımı Hataların Düzeltilmesi ve Kodların Sadeleştirilmesi

Program herhangi bir sisteme entegre edilmediğinden dolayı programın kullanılmasının görülebilmesi için basit bir arayüz geliştirildi. Bu arayüzün sade olmasının sebebi sadece programın kullanılışını ve resmin şifreli halinin görülebilmesidir. Arayüzün görünümü sağda verilmiştir.

Program yazılırken ve yazıldıktan sonra karşılaşılan hatalar düzeltildi. Güvenlik zaafiyeti oluşturabilecek hayati öneme sahip hatalar giderildi. Performansı olumsuz etkilememesi için gereksiz kodlar temizlendi. Kodlara son şekli verildi.

Performans Değerlendirmesi

Algoritmanın belirlenmesi ve programın yazılmasından sonra performans değerlendirmesine geçildi. Performans değerlendirmesinde normal bir resmin yüklenme süresi, şifrelenme süresi ve şifre çözülme süresi karşılaştırıldı. Ölçümler gerçek sunucularda yapıldı. Bu karşılaştırma sonuçları aşağıdaki tabloda verilmiştir.

Resim Boyutlarına Göre İşlem Süresi (Saniye)

 

300 x 300

600 x 800

1024 x 768

Açık Resim Yükleme Süresi

0,04672

0,05245

0,05692

Resim Kriptolama Süresi

0,08653

0,09346

0,1012

Resim Dekriptolama Süresi

0,07741

0,08578

0,09734

Bu ölçümler Ubuntu işletim sistemi kullanan, standart donanımlı bir sunucuda ve daha kapsamlı sonuç elde edebilmek için çeşitli resim boyutlarında yapılmıştır. Ölçümlerde elde edilen verilere göre standart şartlarda bir sunucuda çalışan program, sunucuyu yormamaktadır. Bu da web sitelerine entegre edildiğinde kolayca çalışabileceğini göstermektedir.

Sonuçlar:

  • PHP ve GD kütüphanesi kullanılarak kullanışlı kripto ve dekripto algoritmaları geliştirildi.
  • PNG formatındaki resimler şifrelenerek açık şekilde yapılan iletişimde güvenlik sağlandı.
  • Kripto algoritmasındaki kripto anahtarı sayesinde, kripto algoritması bilinse bile kripto anahtarı bilinmeden resmin şifresi çözülemez. Böylece üçüncü şahıslar şifrelenmiş resmi ele geçirse bile şifreyi çözemez.
  • PHP dilinin kullanılmasından dolayı internet sitelerine kolayca entegre edilebilmektedir.
  • İnternet sitelerine entegre edilen programın yüksek donanıma ihtiyacı olmamasından dolayı hemen her sunucuda rahatlıkla kullanılabilir.
  • Örnek açık resim ve şifrelenmiş resimler aşağıda verilmiştir.
5

Örnek Açık Resim – 1

6

Örnek Kriptolanmış Resim – 1

7

Örnek Açık Resim – 2

8

Örnek Kriptolanmış Resim – 2

Makale sonucu oluşturduğumuz kripto programının kodlarını isteyenlerin info@aaslan.org mail adresine mail göndermesi veya konuya yorum yazması yeterlidir.

Bir önceki yazımız olan PHP ile ODBC İşlemleri ve Kullanım Örnekleri başlıklı makalemizde PHP Dersleri, PHP ile ODBC İşlemleri ve PHP ile ODBC Kullanımı hakkında bilgiler verilmektedir.

About This Author

Uzun yıllardır yazılım ile uğraşıyorum. PHP ile başladığım yazılım hayatıma şu an PHP'nin yanında Swift ve Python ile devam ediyorum. Bu güne kadar bir çok proje geliştirdim ve yeni projeler geliştirmeye de devam ediyorum. Bu sitede yazılımseverlere faydalı bilgiler vermeye, yazılım geliştirmeye, öğrendiklerimi paylaşmaya, yeni başlayanlara yol göstermeye ve onlara yardımcı olmaya çalışıyorum.

4 Comments

You can post comments in this post.


  • Heya i’m for the first time here. I found this board and I find It really useful & it helped me out a lot. I hope to give something back and help others like you aided me.

    chwilowki 4 sene ago Reply


  • benim de resim içine resim gömmem gerekiyor nasıl yapacağımı bilmiyorum yardımcı olur musunuz

    mizgin 2 sene ago Reply


    • programın kodlarına ulaşmam mümkün mü acaba ?

      Yunus Emre 2 sene ago Reply


  • Merhaba hocam. Size mail attım umarım denk gelirsiniz

    Ali 2 sene ago Reply


Post A Reply