21 Ocak 2013 Pazartesi

.NET ve Şifreleme(Encryption) Teknikleri


.NET ve Şifreleme(Encryption) Teknikleri

Bundan önceki yazılarımızda sizlere klasik şifreleme tekniklerinden bahsetmiştik. Bu yazı dizimizde sizlerle .NET ile Şifreleme tekniklerini inceleyeceğiz. Önceleri çokça bahsettiğimiz şifreleme algoritmalarının uygulamalarını kendimizde gerçekleyebilirdik. Ancak .NET post-modern şifreleme teknikleri zaten desteklemektedir. Bir giriş niteliğindeki bu yazımızda .NET'in Cryptography namespace'ini irdeleyeceğiz.
System.Security.Cryptography namespace'i güvenli şifreleme, deşifreleme ve diğer güvenlik hizmetlerini gerçekleştiren hashing, rasgele sayı üretimi ve mesaj doğrulama gibi şifreleme servislerini içerir. Daha önceki makalelerimizde bahsettiğimiz gibi şifreleme genel olarak;
  • Gizlilik(Confidentiality)
  • Veri Bütünlüğü(Data Integrity)
  • Kimlik Doğrulama(Authentication)
güvenlik servislerini sağlamak için kullanılıır. .NET ile sağlanan şifreleme tekniklerini 4 ayrı gruba ayırmamız mümkündür:
  • Simetrik Şifreleme (symmetric cryptography): Private-key encryption olarak da bilinir. Her iki tarafın da bildiği tek bir ortak anahtar kullanarak şifrelemeyi ve deşifrelemeyi gerçekleyen şifreleme teknikleridir. DES, RC2, Rijndael ve TripleDES(3DES) Cryptography namespace'i altında yer alan şifreleme teknikleridir. Bu şifreleme tekniğinin en önemli dezavantajı her iki tarafın tek bir anahtar üzerinde anlaşması ve sadece bu anahtarı kullanarak şifreleme/deşifreleme işlemini gerçeklemesidir. Bu teknikte hiç bir taraf, karşı tarafın gerçekten karşı taraf olup olmadığını bilememektedir. Hatta öyle ki iki tarafda olması gereken kişiler olmayabilir. Genellikle simetrik şifreleme diğer şifreleme tekniklerinde transfer edilecek anahtarlar gibi her iki taraf içinde ortak ifadelerin şifrelenmesi gerektiğinde kullanılır.
  • Asimetrik Şifreleme (asymmetric cryptography): Public-key encryption olarak da bilinir. İkili anahtar kullanarak şifreleme ve deşifrelemenin gerçeklendiği şifreleme tekniğidir. Bu şifreleme tekniğinde herkesin 2 anahtarı vardır. Bunlardan biri public'tir, yani herkesce bilinir. Diğeri ise private'dır ve sadece şifrelemeyi gerçekleyen tek bir taraf tarafından bilinir. Bu iki anahtarın rasgele seçilmiş iki anahtar şeklinde değildir. İkisi de birbirini bütünleyen iki anahtar şeklindedir. .NET Framework DSA ve RSA algoritmalarını kullanmaktadır.
  • Cryptographic signing: Verinin gerçektende belirli bir kişi ya da gruptan geldiğinin anlaşılması için tarafların verileri kendi imzaları ile şifrelemesi prensibine dayanır. Bu işlem hash fonksiyonlarını da kullanmaktadır. Veriyi gönderenin ve alanın gerçekten de kendilerinin olduğunu kanıtlamalarını sağlar. Gönderen kendi private anahtarı ile şifrelerken gönderenin public anahtarını bilen herhangi biri veriyi gönderenin gerçekten de gönderen olup olmadığını anlayabilir ancak alıcıdan başka kimse gönderilen bilgiyi deşifre edemez. Yine .NET Framework DSA ve RSA bu tür şifreleme teknikleri için kullanmaktadır. Bir önceki şifreleme tekniği ile kullanım ayrılıklarını daha sonraki makalelerimizde detaylı olarak irdeleyeceğiz.
  • Cryptographic hashes: Herhangi bir boyuttaki bir bilgiyi sabit uzunluktaki bir byte dizisiyle eşleştirir. Hashler istatiksel olarak tektir(unique), yani iki farklı byte diziliminin aynı hash değerine sahip olamaz. Hash işlemi genellikle tek yönlü fonksiyonlarla gerçeklenir. Tek yönlü fonksiyonlar, matematikteki tersi alınamayan fonksiyonlardır. Örnek olarak bir sayının belirli bir sayıya göre modunun alınmasını verebiliriz. 25 ve sayısının mod 10 daki karşılığı 5 iken mod 10 daki karşılığı 5 olan sayı sadece 25 değildir. Yani şifrelenmiş metni kaybettik! Geri dönüşümüz yoktur. Verdiğimiz örnekten de dikkat edeceğiniz üzere iki farklı sayı aynı hash değerine karşılık geldi. Oysa demin farklı iki byte diziliminin aynı hash değerine sahip olamayacağını söylemiştik. Bu noktada kendimizle çelişiyor gibi olabiliriz. Ama günümüzde kullanılan hiç bir hash fonksiyonu verdiğimiz örnekteki kadar basit ve dar alanlı değildir. HMACSHA1, MACTripleDES, MD5, SHA1, SHA2, SHA3, SHA5 .NET Framework'te yer alan bu tür şifreleme teknikleri örneklerindendir.
Yukarıda saydığımız şifreleme tekniklerinin .NET ile gerçeklenmesini bu yazı dizimizin ilerki makalelerinde bulabilirsiniz. Yine şifreleme teknikleri kadar önemli bir noktada "Random Number Generation" rasgele sayı üretimidir. .NET Framework RNGCryptoServiceProvider sınıfı ile bu sorunun üstesinden gelmeyi bilmiştir.
Şimdiye kadar bahsettiğimiz şifreleme tekniklerine ek olarak çok basit anlamda çalışan kendi şifreleme tekniğimizi geliştirebiliriz. Sizlere daha önceki makalelerimizde bahsettiğimiz şifreleme tekniklerinden Ceaser şifreleme tekniğini gerçekleyen ve kullanan bir web servisi uygulamasını geliştirelim.
Ceaser Cipher
Örnek Ceaser Cipher uygulamamýz için öncelikle bir web servisi uygulamasý baþlatalým. Bu ve bundan sonraki örneklerimiz bizim kullanacaðýmýz isim konvansiyonu doðrultusunda web servisimize SYCryptologyServices adýný verelim. Ve bu web servisi projesine "CeaserCipher.asmx" isimli bir web servisi oluþturalým. Aþaðýdaki kod parçaçýklarýný da sýrasýyla kodumuza ekleyelim;
private byte CeaserCipherIncrement=2;            
                   [WebMethod]                   
                   public string CeaserCipherEncrypt(string plainText) {
                             StringBuilder sb=
new StringBuilder(); 
        
for (int i=0;i<plainText.Length;i++) 
                            { 
                                     
byte b=(byte)plainText[i]; 
                                      b+=CeaserCipherIncrement; 
                                      sb.Append((
char)b); 
                            } 
                           
return sb.ToString(); 
}

Eklediðimiz bu fonksiyon kendisine gönderilen plainText'in her karakterinin ASCII karþýlýðýnýn deðerine 2 ekleyerek plaintext'i þifrelemektedir. Hatýrlayacaðýnýz üzere Ceaser Cipher sadece 26 harf üzerinden çalýþýyor ve toplamý 26'yý aþan karakterlerin 26'ya göre modu alýnarak þifreleme iþlemi gerçeklenmekteydi. Boþluk sayý vb özel karakterlerinde þifrelenmesine olanak tanýmak için biz ASCII karþýlýðýna 2 ekledik. Mod'unu almak yerine deðiþkenimizi byte tanýmladýk. Bildiðiniz üzere byte [0..255] aralýðýndaki sayýlarý ifade etmektedir. Toplamý 255 sýnýrýný aþan sayýlarda mod alma iþlemi programlama dili tarafýndan otomatik yapýlmaktadýr. Þimdi de þifrelenmiþ bu metni deþifreleyecek web fonksiyonunu geliþtirelim:
[WebMethod]                   
public string CeaserCipherDecrypt(string encryptedText) {
         StringBuilder sb=
new StringBuilder();
        
for(int i=0;i<encryptedText.Length;i++)
         {
                  
byte b=(byte)encryptedText[i];
                   b-=CeaserCipherIncrement;
                   sb.Append((
char)b);
         }
        
return sb.ToString();

Eklediðimiz bu fonksiyon kendisine CeaserCipherEncrypt fonksiyonu ile þifrelenmiþ olarak gönderilen metnin her karakterinin ASCII karþýlýðýnýn deðerinden 2 çýkartýlarak plaintext'i elde etmektedir. Yukarýda da bahsettiðimiz gibi, Ceaser Cipher'dan farklý olarak 256 karakter üzerinden çalýþan bir web metodu geliþtirmiþ olduk. Herhangi bir metni bu web servislerini kullanarak þifreleyebilir ve deþifreleyebiliriz. Bunlarý web servis olarak gerliþtirerek herkesin her uygulamasýndan bu fonksiyonlarý kullanmasýna olanak tanýmýþ olduk. Örneðin bu web servisini bir "Managed C++ console" uygulamasýndan bile çaðýrabilirsiniz. Bu tür basit ve sistemi çok fazla yormayan bir þifreleme tekniðini, kullanýcýlarýn log on olmadan girdiklerinde sitenizden yararlanamamalarý için kullanabilirsiniz. Bunun için yapmanýz gereken ASP.NET kullanýcýya gönderilen tüm response'i bu metotlarý kullanarak þifrelemek ve deþifrelemektir. 
Bu yazýmýzda System.Security.Cryptography namespace'i altýnda yer alan þifreleme tekniklerinden bahsettik. Bundan sonraki yazýlarýmýzda bu þifreleme tekniklerinin her birini detaylý olarak inceleyeceðiz ve her birine iliþkin bir örnek uygulama geliþtireceðiz. Ayrýca bu yazýmýzda Ceaser þifreleme tekniðine benzer bir þifreleme ve deþifreleme gerçekleþtiren bir web servisi geliþtirdik. Siz de daha önceleri sizlerle paylaþtýðýmýz þifreleme teknikleri için benzer uygulamalar geliþtirebilirsiniz.

Suphi UÇAR – Yunus Emre ALPÖZEN

Hiç yorum yok:

Yorum Gönder

isterseniz anonim seçeneginden kayıtsız gönderebilirsiniz iyi günler