KRİPTOGRAFİ & ŞİFRELEME(Encryption) ALGORİTMASI & YAZININ ASCII KODLARINA ÇEVRİLMESİ
Merhaba değerli Yazılımcı / Programcı arkadaşlar,
Günümüz dünyasında Bilgisayarların yaygınlaşmasıyla birlikte milyonlarca insan tarafından çeşitli amaçlarla kullanılmaktadır. Örneğin; Bankalarda, Alışverişlerde, Vergi Dönüşümlerinde, Askeri Orduda, Öğrenci Kayıtlarında… Gibi örnekleri çoğaltabileceğimiz alanlarda çeşitli ihtiyaçlar için kullanılmaktadır. Fakat Gizlilik konusu hemen hemen bu alanların hepsinin temel sorunudur. Bundan dolayı Bilgi Güvenliğinin yeri tartışmasız bir şekilde kabul görmüştür. Bilgi hırsızlarına karşı alabileceğimiz önlemleri düşündüğümüzde de başlı başına sorunlarla karşılaşmaktayız. Yazacağımız uygulamalara, programlara… Vb. başkaları tarafından erişimi engellemek ve şifre yöntemiyle yetkilendirdiğimiz kişiler veya bilgileri kimsenin anlamayacağı şekilde şifrelemek ise günümüz dünyasında olmazsa olmazlar arasına girmiştir. Şifreleme yöntemi neredeyse her alanda kendini göstermeye başlamıştır. Bu yazımızda VB.Net Programlama dilinde Şifreleme Algoritmasını(Algorithm of Encyrption) Flow chart (Akış Diyagramı) ile vererek örnek bir uygulama çerçevesinde verilen bir yazıyı şifreleyerek bir dizi sayı olan ASCII kodlarına nasıl çevrildiğini göreceğiz. Hemen akabinde ise oluşturduğumuz şifrenin nasıl çözümleneceğine dair yöntemimizi belirteceğiz.
Haydi, başlayalım değerli yazılım aşığı dostlarım;
__________________________________________________ _____________________
Dersimize başlamadan önce belli başlı temel kavramları açıklayarak konumuza bir giriş yapalım sevgili arkadaşlar;
Söz konusu dersimiz Şifreleme ve Güvenlik ise; Güvenliği iki başlık şeklinde inceleyebiliriz.
1- Bilgisayar Güvenliği:
Verilerimizi korumak ve bilgi hırsızlarını engellemek ve bunlara karşı alınacak tedbirlerin tümü olarak açıklayabiliriz.
2- Ağ Güvenliği:
Basit olarak iletişim güvenliği diyebiliriz.
Güvenlik Sisteminin (Bilgisayar ve Ağ Güvenliğini) oluşturan katmanlar mevcuttur. Peki, nedir bu katmanlar? Diye aklınıza hemen bir soru takılmış olabilir. Katmanlarımız açıklayacak olursak:
Tüm Sistemin Güvenliği(Security of System)
Güvenlik Protokolleri(Security of Protocols)
Kriptografi(Cryptography)
Bu katmanlar içerisinde en üstten başlayacak olursak;
Tüm Sistemin Güvenliği; Tüm Ayrıntıları içerir, Mesela; Yönetim Politikası, Kişilerin Eğitimi vs. içeren katmandır.
Güvenlik Protokolleri: Kriptoloji Algoritmalarını kullanarak bazı işlevselliği sağladığımız katmandır.
Kriptografi: Güvenlik katmanları mekanizmasının yapıtaşı diyebiliriz.
Cryptography (Crypt + Graphy), Kelimelerinin birleşmesinden meydana gelmiştir. Ve anlamı ise Gizli + Yazma anlamındadır. Peki,Kriptografi kelimesinin genel anlamı nedir? Dilerseniz bunu açıklayalım.
Kriptografi: Bilgi hırsızlarına karşı, bilginin güvenli bir şekilde alıcıya iletimini sağlamak amacıyla geliştirilmiş matematiksel yöntemlerdir.
Güvenlik mekanizmasına yapılan saldırılar iki çeşittir. Bunlardan biri Aktif Saldırılar (Active Attacks), diğeri ise Pasif Saldırılardır (Passive Attacks).
--Aktif Saldırılar
- Rol yapmak
- Gönderilen Eski mesajın tekrarlanması
- Aktarılan mesajın içeriğini değiştirme (Modification of Message)
- Hizmet dışı bırakarak engelleme (Interruption)
--Pasif Saldırılar
- Gönderilen Mesajın içeriğini edinme
- Sistem Trafiğinin akışını takip etme
Şeklinde gösterilebilir.
Eğer, bir sistemin Güvenliğini sağlamak istiyorsak bazı önemli gereksinimlere ihtiyacımız var demektir: Kriprografik bakış açısıyla güvenlik mekanizmasının koruma amaçları aşağıda verilen gereksinimleri karşılayabilmelidir:
Gizlilik-Mahramiyet(Privacy)
Aktarımlarda verinin pasif saldırılardan korunarak şifrelenmesidir.
Gönderici tarafta verinin şifreleme işlemlerinin gerçekleşmesi ve alıcı tarafta çözümlenmesi için Encryption-Decryption algoritmaları kullanılır. (Bu yazımızda bu konuya değineceğiz)
Örneğin: Trafik akışının gizlenmesi gibi.
- Bütünlük (Data Integrity)
Aktarılan verinin bütünlünün sağlanmasıdır. Yani gönderilen mesajın içeriğinin değişmemesidir.
Verilerimize dair bütünlüğü sağlamak için HASH FUNCTION kullanılır. (Başka bir yazımızda HASH FUNCTION konusuna değineceğiz)
- Güvenirlik (Confidentiality)
Bilginin veya İletişim olayının doğrulanmış yetkili kişilerce yapılmasıdır. Bunlar dışında bu bilginin ve iletişimin okunmasına karşı korumadır.
- İnkâr Edememe (non-repudation)
Gönderici tarafından gönderilen ve Alıcı tarafından alınan mesajın inkâr edilememesi olayıdır.
Mesela; Muhammed ÖNAL ile Veysel Uğur Kızmaz arasında bir para transferi yapıldığını düşünelim. Muhammed, Veysel Uğur’a $1000 gönderdiyse , $2000 gönderdim diyemeyecek. Bu sistemin sağlanması için digital signature (e-imza) yöntemi kullanılır.
Şimdi ise, aşağıda verecek olduğumuz bazı önemli Güvenlik Saldırılarına karşı Kriptografi’ye gerçek anlamda niçin ihtiyaç duyduğumuzu anlamış olacağız.
İşte bu Güvenlik Saldırılarından bazıları:
o Dinleme(Intercept):
Yetkilendirilmemiş yada kullanıcı kimliği doğrulanmamış bir tarafın kaynağa erişebilmesi ve bu kaynağı kopyalayabilmesidir.
Çözüm: Şifreleme (Encryption)
o Engelleme (Interruption):
Kullanılan Sistemin kaynaklarından birinin kullanılamaz hale getirilmesidir. İletişim hattının kesilmesi gibi.
o Donanım Çöktürmesi ve Yıkımı
o Program ve Dosya silimi
o DoS (hizmet aksattırma) saldırıları
Denial-of –Service, olarak bilinir. DoS saldırılarında hack etme olayı yoktur. DoS,saldırılarında tamamen kullanılan kaynaklar vasıtasıyla müşteriler ve ziyaretçilere geçici veya uzun süreli hizmeti kesintiye uğratmaktır.Bu saldırı tipinde yakalanmamak için Zombi adı verilen aracı bilgisayarlar vasıtasıyla gerçekleştirilir. Saldırılar bu Zombi aracı bilgisayarlar vasıtasıyla yapılarak aynı anda bir çok bilgisayarın saldırmasını sağlar ve kendi IP adresini ve kimliğini gizler.
Örneğin: wwww.Gittigidiyor.com sitesine DoS saldırısı olduğunu varsayalım. Bu Zombi denilen aracı bilgisayarlar vasıtasıyla yapılacağından , GittiGidiyor - Türkiye'nin En İşlek Alışveriş Merkezi ticaret sitesinin müşterilerine ve kullanıcılarına hizmet vermeyi durdurarak milyarlarca maddi zarar vermiş olurlar.
Kripto grafik Temellerde, Klasik bir Şifreleme(Encyrption) olayının blok diyagramı aşağıdaki gibidir:
Blok diyagramımızı kısaca açıklayalım ve verilen ifadelerin ne anlama geldiğini gösterelim.
Key-Anahtar: Algoritma içinde kullanılan sadece alıcı ve gönderenin bildiği bilgilerdir.
Plaintext: Düz / Açık metindir. Orijinal mesajı içerir.
ciphertext: Kodlanmış mesajdır.
Cipher (Şifreleme Tekniği): Kolay ve anlaşılır bir metni anlaşılmaz hale getiren Şifreleme Algoritmasıdır.
Encrypt (E)-Şifrelemek: Verilen Düz metni, şifreli metine dönüştürme işlemidir.
Decrypt (D)-Deşifrelemek: Şifreli bir metni, düz metine geri çevirme işlemidir.
Kriptanaliz (Cryptanalaysis /Codebreaking): Anahtarı bilmeden şifreli metni, düz metine dönüştürme prensipleridir.
— Kriptoloji=Kriptografi+Kriptoanaliz (kelimelerinin birleşimi Kriptoloji bilimini doğurmuştur)
Bu bilgileri verdikten sonra örnek uygulamamıza geçerek Algoritmamızı yazalım.
ÖRNEK UYGULAMA:
Bir yazının şifrelenmesi olayı 3 aşamadan oluşur. Bu aşamaları sıralayacak olursak, şöyle diyebiliriz:
1- Verilen Yazının karakterleri ASCII kodlarına çevrilir
2- Kodlar, gerekiyorsa başlarına 0(sıfır) konarak 4 haneli yapılır ve bütün kodlar sıralı halde String değişkeni şeklinde tutulur.
3- Sıralı halde yazdığımız kodlar, bir baştan, bir sondan karakter alınarak tekrar düzenlenir.
Evet, arkadaşlar göstermiş olduğumuz gibi Verilen bir yazının Şifrelenmesi için bu üç aşamanın gerçekleşmesi gerekir. Şimdi dilerseniz, kısa bir örnek dâhilinde vermiş olduğumuz bu aşamalara açıklık getirelim ve zihnimizde daha kalıcı hale getirelim.
Örneğin:
“Yazılım” kelimesinin şifrelenmesi
1. Y a z ı l ı m karakterleri ASCII kodlarına çevrilir.
Y=121
A=97
Z=122
I=105
L=108
I=105
M=109
2. Kodların başına 0(sıfır) konarak 4 haneli hale getirilir
0121
0097
0122
0105
0108
0105
0109
Ve sıralı halde bir String değişkenine yazılır: 0121009701220105010801050109
Sayının ortasına kadar, önce baştan sonra sondan rakam alınarak tekrar yazılır.
Kod:
0 0 9 0 9 1 0 9 1 0 0 9 1 0 2 0 9 1 0 2 1 0 9 1 0 2 1 1 0 9 1 0 2 1 1 0 0 9 1 0 2 1 1 0 0 0 9 1 0 2 1 1 0 0 5 0 9 1 0 2 1 1 0 0 5 0 0 9 1 0 2 1 1 0 0 5 0 0 0 9 1 0 2 1 1 0 0 5 0 0 9 0 9 1 0 2 1 1 0 0 5 0 0 9 1 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 0 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 0 5 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 0 5 1 0 9 1 0 2 1 1 0 0 5 0 0 9 1 7 0 0 8 1 0 2 1 2 0 0 5 1 0 = Şifre
Evet, arkadaşlar gördüğünüz gibi sıralı olarak son yazdığımız String, bizim elde ettiğimiz Şifre’mizdir.
Şimdi dilerseniz bunu programatik olarak Visual Studio platformunda kod sayfamız içerisinde gösterelim.
Visual Studio 2010 ile Windows proje formumuzu açalım:
Proje Adı: yaziSifreleme
Açılan Formumuza 1 label kontrolü = lblSifre
1 buton kontrolü = btnSifrele ekleyelim. Bu kontroller,kullanıcıdan alınan metinin şifrelenip form üzerindeki lblSifre adındaki label kontrolünde görüntülenmesini sağlayacaklardır.
Açılan formumuza lblDesifre adında bir label kontrolü ve btnSifreyiCoz adında da bir buton kontrolü ekleyelim.
Eklediğimiz bu kontroller şifrelenmiş metinin lblSifre kontrolünden alınarak, şifrelenip görüntülenmesini sağlayacaktırlar.
ÖNEMLİ NOT: Şifreleme algoritmasının tüm kodları btnSifrele kontrolünün Click olayında yazılacaktır.
Buraya kadar Visual Studio ortamında yapacaklarımız adım adım anlatarak göstermiş olduk. Şimdi de ASCII kodlarına Çevirme işleminin Algoritmasını Flow Chart olarak verelim:
ASCII kodlarına çevirme algoritması
1. Şifrelenecek metinin girilmesi için gerekli kodu yazın. Bir metin girilene kadar kullanıcıdan metin istemek için Do Loop Until döngüsünü kullanın.
Resim yeniden boyutlandırıldı, orjinalini görmek için tıklayın.
2.Girilen yazının karakterlerini bir dizide toplamak için String değişkeninin ToCharArray() metodunu kullanın.
3. 3.Karakterlerin ASCII kodu karşılığını tutmak için kodlar isminde bir dizi oluşturun. Oluşturduğunuz bu Karakterler dizisindeki tüm elemanlar üzerinde işlem yapmak için bir döngü kurun. Karakterler dizisindeki her karakteri Asc hazır fonksiyonu ile ASCII koduna çevirin.
4. Bu algoritma sonunda elde edilen kodlar dizisi, şifrelenecek olan metinin her karakterinin ASCII kodunu tutar. Bu dizi diğer algoritmanın giriş değeri olarak kullanılacaktır.
Sıralı Kodlara Çevirme Algoritması
Evet, arkadaşlar bir önceki algoritmamız verilen bir kelimenin ASCII kodlarına çevrilmesine dair algoritmamızdı. Burada vereceğimiz algoritma ise ASCII kodlarını Sıralı Kodlara Çevirme işlemini elde edecek algoritmadır. Yukarıda çevirdiğimiz ASCII kodlarını bir kez daha irdelemiş olursak, unutmamız gereken en önemli nokta; ASCII karakter kodları 0 ile 255 arasındadır. Yani toplamda 256’dır. Ve yine belirtmiştik, her kod maksimum 3 haneli olacaktır. Şifre oluşturduğumuzda ise küçük bir düzenleme yaparak bu kodların başına 0 (sıfır) getirerek 4 haneli hale getirmiştik.
En son yaptığımız işlem ise her karaktere ait ASCII kodunu yazdıktan sonra bu kod dizisini Sıralı halde belirtmiştik. Burada yapacağımız işlem ise diziden çektiğimiz kodları SiraliKodlar adlı bir String değişkenine yazabiliyor olacağımızdır.
Şimdi, programatik olarak adımlarımızı yazalım ve kullanacağımız değişkenleri belirleyelim:
1- Diziden çekeceğimiz kodları sıralı bir halde tutmak için SiraliKodlar adlı bir değişken tanımlamamız gerekir. Ve daha sonra ilk yazdığımız ASCII kodlarını çevirme Algoritmasından alınan ASCII kodlarını tutan kodlar dizisi üzerinde bir döngü kurarız.
İşlemimize ait algoritmamız ise aşağıdaki gibidir.
Resim yeniden boyutlandırıldı, orjinalini görmek için tıklayın.
Önemli Uyarı: Sıralı Kodlar’a ekle (4 numaralı aşama) için yazılacak tüm kodlar While döngüsü içinde yazılmalıdır.
Bu döngüdeiçinde kullanılacak ASCII kodunu bir değişkene atan kodumuzu yazmalıyız.
2- AsciiKodu değişkeninde tutulan Ascii kodununun 4 haneli hale getirilmesi için kaç tane sıfır ekleyeceğimizi bulmamız gerekir. Yukarıda belirtmiştik, Ascii kodları maksimum 3 haneli olur. Ve 0 ile 255 arasında bir değerdir. Şifre yapabilmek için ve 4 haneli hale getirmek için Ascii kodunun başına 0 (sıfır) koyarız. ( kaç sıfır yazabileceğimizi bulmak için 4- ascii kodu karakter kodu sayısı)
Kod:
Dim eklenecek As Byte = 4 - AsciiKodu.Length
3- Eklenecek sayı kadar çalışacak bir döngü içinde, sıfır ekleme işlemini yapmamız gerekir.,
Kod:
For i = 0 To eklenecek - 1 ' Alogritma - 3 numaralı aşama AsciiKodu = AsciiKodu.Insert(0, 0) Next
4- Düzenlenmiş AsciiKodu değerini SiraliKodlar değişkenine yazmamız gerekir ve sayacı(counter) bir artırarak diğer ASCII koduna geçmemiz gerekir.
Kod:
' Alogritma - 4 numaralı aşama SiraliKodlar &= AsciiKodu j += 1
lgoritma sonunda ortaya çıkardığımız değer, karakterlerin 4 haneli ASCII kodlarını tutan bir String değişkenidir. Bu değişken, diğer algoritmayı tekrar düzenlemek üzere kullanacağız.
Evet, arkadaşlar adım adım verilen bir metinin ya da yazının şifreye çevrilmesi algoritmasına doğru gitmekteyiz. Bir sonraki algoritmamız, hiç kuşkusuz ki Şifre oluşturma Algoritması olacaktır. O zaman, zaman kaybetmeden bu algoritmamızı da Flow Chart şeklinde verelim ve gerekli açıklamaları yapalım.
Şifre Oluşturma Algoritması
Bir önceki algoritmada elde ettiğimiz SiraliKodlar değişkeni halen istediğimiz şifreli metin değildir. Çünkü 4 haneli kodlar sıralı bir şekilde durur ve kolayca çözülebilir. Şifrenin ilk bakışta anlaşılmasını daha da zorlaştırmak için, sıralanmış kodları biraz daha karıştırmamız gerekir.
Yapacağımız işlemlere dair algoritmamız aşağıdaki gibi olacaktır.