Makale Özeti

Şifreleme ile bilgilerinizi koruyun

Makale

   Merhabalar

   Sizlerle paylaştığım bu ilk makalenin konusu şifreleme. Çocukluğumuzda birçoğumuz şifreli bir mesaj yazmaya girişmişizdir. Peki nedir şifreleme ne için kullanılır; Şifreleme temel anlamda bazı bilgilerin herkes tarafından rahatça okunabilmesini ve anlaşılabilmesini engellemek amacıyla çözülemeyecek bir şekle dönüştürme işlemidir. Ayrıca günümüzde şifreleme sadece bilgi okunmasını engellemenin yanısıra doğrulama(authentication) amaçlıda kullanılmaktadır. Bir mesaj bir authentication ile şifrelenmişse mesajı alan kişi gönderenin kimliğini ve mesajin değiştirilmeden ilk halinde geldiğinden emin olabilir.

   Şifrelemeye biraz daha bilimsel bir terimle bakacak olursak; şifreleme(cryptography) bir mesajın yetkili kişi(ler) dışında okunmasını engelleyecek matematiksel bir dönüşümdür. Şifreleme (encryption) süreci mesajı gönderen kişi tarafından gerçekleştirilir ve yola çıkan mesajı dinleyebilecek herhangi bir yetkisiz kişinin mesajı anlamasını engellemeyi hedefler. Şifreçözme süreci şifreleme sürecinden geçmiş mesajı alan yetkili kişi tarafından gerçekleştirilir ve gizlenmiş mesajdan (şifrelimetin (ciphertext)) orjinal mesajın (düzmetin (plaintext)) elde edilmesini hedefler. Buradaki en önemli nokta, şifrelenmiş metnin, eğer bu metin bir şekilde istenmeyen bir kişinin/kişilerin eline geçerse çok büyük zorluklarla çözülebilecek şekilde şifrelenmiş olması gerekliliğidir.

   En basit şifreleme alfabenin herbir harfini başka bir harfle tamımlayarak veya her harfe bir rakam kodu vererek yapılanıdır. Bu şifrelemenin kısa mesajlar için güvenliği iyi olsada (Türkçede her bir karakteri 29 farklı karakterle tanımlayabileceğimiz için 29! kadar olasılık söz konusudur.) uzun mesajlar için tercih edilemez. Bu şifreyi kırmak için izlenecek yol şifreliyicinin (alfabe) bazı özelliklerini kullanmaktır.Bu özellikler kullanılan dilin dilbilgisi ve imla kurallarından ve istatistiki verilerden oluşur. Örnekte belirtilen bir şifreleme için konuşacak olursak Türkçede hiç bir kelimenin ğ ile başlayamayacağı, 2 harfli bir kelimenin "ve","de",da,"ki" gibi en çok kullanılan iki harfli kelimelerden biri olma olasılığı, istatistiki olarak bir şifreli metinde en çok geçen karakterin o dile ait en çok kullanılan harfe denk gelme ihtimali gibi verilerin göz önüne alınararak şifre bir noktadan kırılmaya başlandığında diğer taraflarınıda çözmek git gide basit hale gelir.

   Zaman içinde daha güvenlikli olan şifreleme methodları geliştirilmiştir. Bunların en basitlerinden biri bir mesajı örnek bir sayı dizisi belirleyip harflerini o sayı dizisine göre yerlerini değiştirmek. Ancak buradada sayı dizisinin bir süre sonra kendini tekrar etmeye başlamasından faydalanarak şifreler kırılabilmektedir.Bir diğeri ise Metini başka bir anahtar metin ile şifrelemek, bu sefer şifreleyen sayı dizisi yerine bir metindir. Ancak burada şifreleyen metini ne kadar uzun seçersek o kadar başarılı bir şifreleme oluşacağından, şifreleyen metin seçimi çok önemlidir. Şifreleyen metinin çok uzun seçilmesinin zorlugu ve yine bazı açıklar bu sisteminde kullanılırlığını düşürmüştür.

   Ancak matematiğin iş içine girmesi ile daha güvenilir ve sağlam şifreler geliştirilmeye başlanmıştır. Bu yöntemlerden en basitini örnek olması açısından küçük ve anlaşılabilir sayılarla deneyelim;

   İki asal sayının çarpımı olan bir sayı düşünelim bu sayı 2x7=14 olsun.
   Her iki asal sayıdanda 1 çıkarırsak; 7-1=6 , 2-1 = 1 sayılarını elde ederiz.
   Bu iki sayıyı çarparsak 1x6=6 sayısını elde ederiz ve bu sayıyı φ ile gösterelim. Bu sayı şifreleme ve şifre çözmede çok büyük bir öneme sahiptir.
   Şimdi φ ile ortak çarpanı bulunmayan başka bir sayı seçelim, Bu sayı φ nin çarpanlarına (6=2x3) tam olarak bölünemeyen bir sayı olmalıdır.Seçtiğimiz sayı 11 olsun.
   Kodlama işlemine başlıyoruz.ve alfabedeki harfleri numaralandırıyoruz. A=1, B=2, C=3, D=4, E=5,.........
   Şifreleyeceğimiz metin ise BACA dolayısıyla ilk kademede bu metnin sayısal karşılığı 2131 oluyor.
   Her sayıyı aşağıdaki yöntemle şifreliyoruz;

   211 = 2048 = 4(mod 14)
   111 = 1 = 1(mod 14)
   311 = 177147 =5(mod 14)
   111 = 1 = 1(mod 14)

   Şifreleli sayımız 4151 oldu.Burada kuvvet olarak kullandığımız 11 sayısı 4. aşamada elde ettiğimiz sayı mod tabanı ise 1. aşamada elde ettiğimiz sayıdır.
   Şimdi her sayıyı harflere geri çevirelim ve elde edeceğimiz şifreli değer DAEA olur.
   Metinimiz şifrelenmiştir. Ancak şimdi bu metni çözebilmeliyizde yani 4151 sayısını 2131 olarak yazabilecek bir yöntem bulmalıyız.
   Bu çözücü sayı φ kullanılarak bulunur. Formülü ise örneğimiz için 11x(çözen sayı)=1 mod6 Bu durumda çözen sayımız 5 olacaktır.
   O zaman şifreyi çözelim ;

   45=1024 =2 mod(14)
   15=1 = 1 mod(14)
   55=3125 = 3 mod(14)
   15=1 = 1 mod(14)

   Şifreyi çözerek 2131 sayısını elde ettik. Bunu ise harflere çevirdiğimizde BACA metnini geri çözmüş oluyoruz.
   Bu basit örneği herbiri 30 basamaklı olan iki asal sayının çarpımının sonucu olan 60 basamaklı bir sayı ile arka arkaya bulunan 30 karakterin herbirini 2 haneli sayılarla kodlayıp ve bu bloğun hepsini birden şifrelediğimizi düşünürsek şifreleyen sayıyı bilmeyen birinin çözmesi veya çözücü sayıyı bulması çok zordur.

   Günümüzde ise bilgisayar teknolojisinin devreye girmesi şifreleme konusunda büyük adımlar atılmasına neden olmustur.

   Bu kısımda sizlerle kendimin yazmış olduğu bir şifreleme algoritmasını elimden geldiğince açıklayarak paylaşacağım. Algoritmanın yaptığı iş karakterlerin char kodlarıyla oynamak ve randomize sayılara göre metini her seferinde farklı şifreleyebilmektir. Bu algoritmada kullanılan komutlar chr,asc,floor,substring vede mod dan ibarettir. Komutlardanda anlaşılabileceği üzere şifreleme matematik üzerine kuruludur.


Public Class cryptography
    Private sayac As Integer = 1
 
Bu kısımda classımızı ve ileride fonksiyonu iç içe çağırarak şifrelemeyi daha etkin kılacak olan sayacımızı tanımlıyoruz


    Function Encrypt(ByVal gelen As String) As String
       Dim rnd As New Random
       Dim sifreleyenKatsayi As Integer = rnd.Next(10, 99)
       Dim sifrelemeKademe1 As String
       Dim sifrelenecek As String = gelen
 
Şifreleme yapacak olan fonksiyonu, şifrelemede kullanacağımız random(rastgele) sayıyı ve şifrelenecek metini bu kısımda tanımladık ve temel tanımlamaları bitirdik.


      For i As Integer = 0 To sifrelenecek.Length - 1
         Dim sifreyeEklenecek1 As String = Asc(sifrelenecek.Substring(i, 1)).ToString
         Select Case sifreyeEklenecek1.Length
          Case 2
            sifreyeEklenecek1 = "0" & sifreyeEklenecek1
         Case 1
            sifreyeEklenecek1 = "00" & sifreyeEklenecek1
         End Select
         sifrelemeKademe1 &= sifreyeEklenecek1
      Next
 
Bu kısımda ise şifrelenecek metinde bulunan her karakterin ascii kodunu alıyoruz ve 3 haneden küçük bir sayı geliyorsa başına 0 ekleyerek ascii leri 3 haneli sayı şekline dönüştürüp arka arkaya ekliyoruz ve bunu string bir değişkende tutturuyoruz.


      Dim sifreyeEklenecek2 As String
      Dim sifrelemeKademe2 As String
 
Bu değişkenleride tanımladıktan sonra artık esas şifreleme işlemine geçebiliriz.


      If sifrelemeKademe1.Length Mod 2 = 0 Then
         If Not sifreleyenKatsayi Mod 2 = 0 Then
            sifreleyenKatsayi -= 1
         End If
         For i As Integer = 0 To ((sifrelemeKademe1.Length / 2) - 1)
            sifreyeEklenecek2 = (Convert.ToInt64(sifrelemeKademe1.Substring(i * 2, 2)) / 2 + sifreleyenKatsayi + i Mod 20).ToString
            sifreyeEklenecek2 = Convert.ToInt64(Math.Floor(Convert.ToDecimal(sifreyeEklenecek2)))
            sifreyeEklenecek2 = Chr(sifreyeEklenecek2)
            If Convert.ToInt64(sifrelemeKademe1.Substring(i * 2, 2)) Mod 2 = 0 Then
               sifreyeEklenecek2 = Chr(rnd.Next(97, 122)) & sifreyeEklenecek2
            Else
               sifreyeEklenecek2 = Chr(rnd.Next(48, 57)) & sifreyeEklenecek2
            End If
            sifrelemeKademe2 &= sifreyeEklenecek2
         Next
      Else
         If sifreleyenKatsayi Mod 2 = 0 Then
            sifreleyenKatsayi += 1
         End If
         For i As Integer = 0 To ((sifrelemeKademe1.Length / 3) - 1)
            sifreyeEklenecek2 = (Convert.ToInt64(sifrelemeKademe1.Substring(i * 3, 3)) / 2 + sifreleyenKatsayi + i Mod 20).ToString
            sifreyeEklenecek2 = Convert.ToInt64(Math.Floor(Convert.ToDecimal(sifreyeEklenecek2)))
            sifreyeEklenecek2 = Chr(sifreyeEklenecek2)
            If Convert.ToInt64(sifrelemeKademe1.Substring(i * 3, 3)) Mod 2 = 0 Then
               sifreyeEklenecek2 = Chr(rnd.Next(97, 122)) & sifreyeEklenecek2
            Else
               sifreyeEklenecek2 = Chr(rnd.Next(48, 57)) & sifreyeEklenecek2
            End If
            sifrelemeKademe2 &= sifreyeEklenecek2
         Next
      End If
Ancak burada şifrelemenin güvenirliği yani kırılmasının zorluğu bakımından bir sınama ile ilk kademede basitçe şifrelediğimiz metinde(ascii kodlarından oluşan) bulunan karakter sayısı çift ise karakterleri(ascii kodlarını) ikişer ikişer şifreleyeceğiz ve çözerken hangi yöntemle şifrelediğimizi şifreli metinden okuyabilmek için şifreleyen sayıyı mutlak koşulda çift sayıya çevireceğiz., eğer tek sayıda ise ki bu mutlaka 3ün katı olmak zorunda (ascii karakterlerinden herbiri 3 rakamdan oluştuğu için) üçer üçer şifreleyeceğiz ve çözerken hangi yöntemle şifrelediğimizi şifreli metinden okuyabilmek için şifreleyen sayıyı mutlak koşulda tek sayıya çevireceğiz.İki haneye göremi yoksa üç haneye göre şifreleyeceğimizi belirledikten sonra  ve şifreleyen sayıdada gerekli değişiklikleri yapıyoruz.

Şimdi şifreleme mantığını inceleyecek olursak gelen ascii kodlarına sahip karakterleri ikişerli veya üçerli guruplar halinde ele alıyoruz ve gelen bu rakamı ikiye bolup şifreleyen sayı ile topladıktan sonra for dongusundeki sayacın 20 ile bolumunden kalanınıda bu degere topluyoruz. Bunu toplamamızdaki amaç şifreleme mantığını her gelen karakter için değiştirmek.

Daha sonra elde ettiğimiz sayıyı ki bu sayı 255 den büyük olamaz (oluşturdugumuz 3 haneli sayilar ascii kodları oldugundan en fazla 255 olabilir, biz bunları 2 ye bölerek max sayımızı 128 yapıyoruz ve max random sayımız 99 oldugundan vede mod değerimiz en fazla 19 aldıgından bu sayının 255 i geçmesi mümkün değildir. Geçerse ascii tablosunda karakter karşılığı olmayacaktır.) karakter kodu olarak değerlendirip karaktere çeviriyoruz. Ancak burada çok önemli bir sorunla karşı karşıyayız elde ettiğimiz 3 haneli sayı (ascii kodu) tek sayı ise bunu ikiye bölerken bir fazlası olan sayıyıda ikiye bölerken iki karakterin aynı şekilde şifrelenmesi meydana gelebilir. Biz yine o iki karakteri aynı şekilde şifreleteceğiz ancak çakışmayı engellemek içinse bir if sınaması içinde eğer tek sayı ise önüne rastgele bir rakam yok çift sayı ise önüne rastgele bir tane harf koyuyoruz. Bu karakterler şifremizi dahada mantıksız hale getireceğinden daha zor kırılmasınıda sağlayacaklardır.

Bu işlemleri for döngüsünde her ascii kumesi için yaptığımızdan en sonda ise bunları başka bir string değişkende birleştiriyoruz.


      Dim sifreleyenkatsayi1 As Integer = Convert.ToInt64(sifreleyenKatsayi.ToString.Substring(0, 1)) + Convert.ToInt64(sifreleyenKatsayi.ToString.Substring(1, 1)) + sifreleyenKatsayi
      Dim sifreleyenKatsayiSifrelenmis As String = Chr(Math.Floor(sifreleyenkatsayi1 / 3)) & Chr(sifreleyenkatsayi1 - Math.Floor(sifreleyenkatsayi1 / 3))
Şifreleyen sayıyı en başta rastgele üretmemizden dolayı şifre çözerken okuyabilmemiz önemlidir. Buda demek oluyorki şifreleyen sayıyı şifrelenmiş metinin içinde belirli bir yere koymalıyız vede şifreyi çözerken o bizim bildiğimiz yerden okuyup çekmeliyiz. Şifreleyen sayı içinde iki kademe şifreleme sistemi uygulayacağız. Bu şifreleme sistemlerinden ilki sayının rakamsal değerine basamaklarının rakamsal değerlerini ekleyerek yeni bir sayı oluşturmak.

İkinci şifreleme aşaması ise oluşturduğumuz bu rakamın üçe bölümünden bölüm hanesini alarak bunun karakter karşılığını bulmak vede sayının tümünden bu bölüm hanesini çıkararak onunda karakter karşılığını bulmak ve birleştirip 2 haneli şifreli bir string elde etmekdir.


      sayac += 1
      If sayac < 3 Then
         Return Encrypt(sifreleyenKatsayiSifrelenmis.Substring(0, 1) & sifrelemeKademe2 & sifreleyenKatsayiSifrelenmis.Substring(1, 1))
      Else
         sayac = 1
         Return sifreleyenKatsayiSifrelenmis.Substring(0, 1) & sifrelemeKademe2 & sifreleyenKatsayiSifrelenmis.Substring(1, 1)
      End If
   End Function
Bu aşamada yaptığımız işlem ise gayet basit oluşturduğumuz 2 haneli şifrelenmiş şifreleyen sayının ilk karakterini şifrelenmiş metinin başına diğerini ise sonuna ekliyoruz. Ve kendimizin belirlediği bir sayaç sayısında şifrelenmiş metini tekrar tekrar aynı yöntemle şifreleyerek güvenliğini arttırıyoruz.Ancak unutmamakta fayda varki sayaç sayısını her arttırdığımızda işlemcinin cevap verme süresi uzayacaktır.

Şimdi ise şifrelediğimiz bu metni nasıl geriye çevirebileceğimizi inceleyelim


   Function decrypt(ByVal gelen As String) As String
      Dim cozulecek As String = gelen
      Dim sifreleyenKatsayiSifrelenmis As String = cozulecek.Substring(0, 1) & cozulecek.Substring(cozulecek.Length - 1, 1)
      Dim katsayisizCozulecek As String = cozulecek.Substring(1, cozulecek.Length - 2)
      Dim sifreleyenkatsayi1 As Integer = Asc(sifreleyenKatsayiSifrelenmis.Substring(0, 1)) + Asc(sifreleyenKatsayiSifrelenmis.Substring(1, 1))
      Dim SifreleyenBasamak1 As String
      Dim SifreleyenBasamak2 As String
Bu kısımda yaptığımız işlem ise gelen şifreli metnin içinden şifreleyen sayıyı çıkartmak karakterlerin ascii karşılığını bulup toplayarak tek bir sayı elde etmektir.Elde ettiğimiz bu sayı hala şifreleyen sayının kendisi değildir.Sadece İkinci kademe şifresi çözülmüştür yani değeri ile basamaklarının rakam değerlerinin toplamı halindedir.


      If sifreleyenkatsayi1.ToString.Length > 2 Then
         If sifreleyenkatsayi1 Mod 2 = 0 Then
            SifreleyenBasamak1 = "8"
            SifreleyenBasamak2 = (((sifreleyenkatsayi1 Mod 11) + 11) / 2).ToString
         Else
            If sifreleyenkatsayi1 > 110 Then
               SifreleyenBasamak1 = "9"
               SifreleyenBasamak2 = (((sifreleyenkatsayi1 Mod 11) + 11) / 2).ToString
            Else
               SifreleyenBasamak1 = "9"
               SifreleyenBasamak2 = ((sifreleyenkatsayi1 Mod 11) / 2).ToString
            End If
         End If
      Else
         If (sifreleyenkatsayi1 Mod 11) Mod 2 = 0 Then
            SifreleyenBasamak1 = Math.Floor(sifreleyenkatsayi1 / 11).ToString
            SifreleyenBasamak2 = ((sifreleyenkatsayi1 Mod 11) / 2).ToString
         Else
            SifreleyenBasamak1 = (Math.Floor(sifreleyenkatsayi1 / 11) - 1).ToString
            SifreleyenBasamak2 = (((sifreleyenkatsayi1 Mod 11) + 11) / 2).ToString
         End If
      End If
      Dim sifreleyenkatsayi As Integer = Convert.ToInt64(SifreleyenBasamak1 & SifreleyenBasamak2)
Bu kısımda yaptığımız işlem ise şifreleyen sayıyı ilk kademede şifrelerken yaptığımız işlemi(sayının değeri ile basamak değerlerini toplamak) tersine çevirerek şifreleyen sayıyı şifresiz salt bir şekilde etlde etmektir.


      Dim cozulenKademe1 As String
      Dim yenidenRakamOlmus As String
      For i As Integer = 0 To katsayisizCozulecek.Length / 2 - 1
         If IsNumeric(katsayisizCozulecek.Substring(i * 2, 1)) Then
            cozulenKademe1 = ((Asc(katsayisizCozulecek.Substring(i * 2 + 1, 1)) - sifreleyenkatsayi - i Mod 20) * 2 + 1).ToString
         Else
            cozulenKademe1 = ((Asc(katsayisizCozulecek.Substring(i * 2 + 1, 1)) - sifreleyenkatsayi - i Mod 20) * 2).ToString
         End If
         If sifreleyenkatsayi Mod 2 = 0 Then
            If cozulenKademe1.Length = 1 Then
               cozulenKademe1 = "0" & cozulenKademe1
            End If
         Else
            If cozulenKademe1.Length = 2 Then
               cozulenKademe1 = "0" & cozulenKademe1
            ElseIf cozulenKademe1.Length = 1 Then
               cozulenKademe1 = "00" & cozulenKademe1
            End If
         End If
         yenidenRakamOlmus &= cozulenKademe1
      Next
Bu kademede yaptığımız ise gelen metini ikişer ikişer guruplayıp bu gurupları çözerek yeniden ascii numaralarından oluşan stringi elde edebilmek. Elde ettiğimiz iki karakterli gurupta bulunan ilk karakter şifreleme sırasında ardaşık bir tek sayi ile çift sayıyı 2ye bölme sırasında aynı şekilde şifrelendiği ve bunu ayırtmak için başvurduğımuz yöntemdi. Bundan dolayı karakterin ascii kodunu elde ettikten sonra koda 1 ekleyip eklemememiz gerektiğini bu ilk karakterin rakam olup olmaması durumuna göre kontrol ettiriyoruz. Bunun dışında şifre çözme işi şifreleme işinin tam tersi oldugundan karakter kodunu 2 ile çarpıp şifreleyen sayıyı ve for un sayacından değer alıp mod20 ye göre oluşan değişken sayıyı çıkararak vede daha sonra bulduğumuz bu değerleri birleştirerek Ana metindeki karakterlerin ascii kodlarının yan yana yazılmıs halini elde ediyoruz. Ancak şifresini çözdügümüz bir karakterin ascii kodunu başına 0 ekleyerek uygun hane sayısına getirmeliyiz. Uygun hane sayısı ise bizim ana ascii kodları barındıran stringi kaçar kaçar bölüp şifrelediğimiz ile alakalıdır(Hatırlarsanız 2şerli veya 3erli bölebiliyorduk ve kaçarlı böldüğümüzü şifreleyen sayının tek veya çift olmasına göre kontrol ettirebiliyorduk.)


      Dim cozulmuskademe2 As String
      Dim cozulmus As String
         For i As Integer = 0 To yenidenRakamOlmus.Length / 3 - 1
         cozulmuskademe2 = Chr(Convert.ToInt64(yenidenRakamOlmus.Substring(i * 3, 3)))
         cozulmus &= cozulmuskademe2
      Next
Şifre çözmenin bu adımında ise elimizde bulunan ascii kodlarının arka arkaya yazılmış olduğu metinden ascii kodlarını üçerli üçerli çekiyoruz ve bu ascii kodlarının karakter karşılıklarını birbirine ekleyerek yeni bir string oluşturuyoruz.


      sayac += 1
      If sayac < 3 Then
         Return decrypt(cozulmus)
      Else
         sayac = 1
         Return cozulmus
      End If
   End Function
End Class
Ve en son adımda ise sayaç kullanarak iç içe şifrelediğimiz metni iç içe çözme işlemini gerçekleştiriyoruz. Ve sonunda şifrelediğimiz metnin şifresini çözerek elde edebiliyoruz.

Sayaç sayısını arttırarak güvenliğini arttırabileceğimiz bu şifreleme tekniğini querystringlerin şifrelenmesinde kullanamayacağız çünkü ascii kodlarının karşılığı olarak dönen şifreli metin. Enter,Tab gibi bazı karakterler içermekte ve bu karakterler querystringlerde problem yaratmaktadır.

Günümüzde en basit kullanım olarak internete açık olan bilgisayarlarda veya kişisel bilgisayarlarımızda erişilmesini istemediğimiz bazı bilgilere erişilmesini saklamak için kullanılan şifreleme çok gelişmiş anlamda ise birçok şirketin verilerini koruyarak, çalınmasını engelleyerek teknoloji hırsızlıgına karşı ayakta durabilmesini sağlayan bir yöntemdir ve önemi gün geçtikçe artmaktadır.

Kodları indirmek için tıklayın.

Tamer ÖZ

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com