Kriptografi çok geniş bir konu olmasına rağmen bu makalede işin teorik tarafıyla ilgilenmeden .NET Framework ile gelen DESCryptoServiceProvidersınıfından yararlanılarak nasıl şifreleme yapıldığından söz edilecektir. Bu amaçla projenin formuna RichTextBox ve Button nesnesi yerleştirdik. Yarın bir gün yerli yazarın birisi forma Button nesnesi yerleştirip buna Şifrele başlığını vermek benim buluşumdur deyip mahkemeye koşarsa bu benim için süpriz olmaz. Ne de olsa "forma yerleştirilen düğmeye şifrele başlığını vermek çalıntı yapmaktır" diyecek bilen kişiler az değildir bu memlekette.

Kullanıcı şifrelemek istediği metni RichTextBox’a yazıp “Şifrele” başlıklı düğmeyi tıklayacak. Şifrelenmek istenen bilgileri byte dizisine aktarmak gerektiği için string bilgileri byte dizisine aktaran bir metot hazırladık. Bu metot string tipte bir parametreye sahip olup geriye byte dizisi göndermektedir.
staticbyte[] byte_yap(string str)
{
byte[] dizi_byte = Encoding.UTF8.GetBytes(str);
return dizi_byte;
}
Bu metodu hazırladıktan sonra formdaki RichTextBox’ın içeriğini, şifreleme anahtarını ve başlangıç vektörünü byte dizisine aktarmak üzere formdaki düğmenin Click olayını temsil eden metodu aşağıdaki gibi düzenledik. Şifreleme yapılırken anahtara ve başlangıç verktörüne gerek duyulduğu için 8 karakterlik bu 2 bilgiyi byte dizilerine aktardık. Kod uzamasın ve işlem kolay izlensin diye anahtar ve başlangıç vektörünü direk kodun içine yazdık.
privatevoid sifrele_Click(object sender, EventArgs e)
{
byte[] dizi = byte_yap(richTextBox1.Text.Trim ());
byte[] baslangic_vektor = byte_yap("12345678");
byte[] anahtar = byte_yap("87654321");
}
Bu 2 bilgiden anahtara deşifre işlemi yapılırken gerek duyulur. Başlangıç vektörü gizlenmeyebilir ama tahmin edilemez olmalıdır. Aynı anahtar ve başlangıç vektörünü 2 kere kullanmamak gerekir. Başka bir deyişle hem anahtarların hem de başlangıç vektörlerinin rastlantısal olarak seçilmeleri önerilmektedir.
.NET Framework ile birlikte şifreleme yapılırken kullanılan çok sayıda sınıf gelmektedir. Bu makalde DESCryptoServiceProvider sınıfını tercih ettik. DESCryptoServiceProvider sınıfıyla yapılan şifreleme işlemine kısaca DES(Data Encryption Standard) adı verilmektedir. DES’te veriler 64 bitlik bloklar yani 8’e karakterlik bloklar halinde şifrelenir.
Şifrelenmiş metni diskte bir dosyaya yazmak istediğimiz için ayrıca bir FileStream nesnesine gerek vardır. DESCryptoServiceProvider ve FileStream nesnesini nasıl hazırladığımızı aşağıda görebilirsiniz. Şifreleme yaparken yararlanmak istediğimiz sınıflar System.Security.Cryptography ve System.IO’da oldukları için using deyimiyle bu namespace’lerdeki sınıflardan yararlanmak istediğimizi kod dosyasının başında belirttik.
privatevoid sifrele_Click(object sender, EventArgs e)
{
byte[] dizi = byte_yap(richTextBox1.Text.Trim ());
byte[] baslangic_vektor = byte_yap("12345678");
byte[] anahtar = byte_yap("87654321");
FileStreamdosya_akis = new FileStream("c:\\sifreli.txt", FileMode.Create, FileAccess.Write);
DESCryptoServiceProvidernesne = new DESCryptoServiceProvider();
}
Şifreleme işlemi asıl IcryptoTransform ve CryptoStream nesnesi tarafından yapıldığı için bu koda ekleme yapıp ICryptoTransform nesnesi hazırladık. ICryptoTransform nesnesi DESCryptoServiceProvider sınıfının CreateEncryptor() metoduyla hazırlanmaktadır. Bu metot şifreleme anahtarını ve başlangıç vektörünü parametre olarak almaktadır. Devamında CryptoStream nesnesi hazırlayıp byte dizisine aktarmış olduğumuz bilgileri şifreleyip dosyaya yazdık.
privatevoid sifrele_Click(object sender, EventArgs e)
{
byte[] dizi = byte_yap(richTextBox1.Text.Trim ());
byte[] baslangic_vektor = byte_yap("12345678");
byte[] anahtar = byte_yap("87654321");
FileStreamdosya_akis = new FileStream("c:\\sifreli.txt", FileMode.Create, FileAccess.Write);
DESCryptoServiceProvidernesne = new DESCryptoServiceProvider();
ICryptoTransform kripto_arayuz = nesne.CreateEncryptor(anahtar, baslangic_vektor);
CryptoStream kripto_akis = new CryptoStream(dosya_akis, kripto_arayuz, CryptoStreamMode.Write);
kripto_akis.Write(dizi, 0, dizi.Length);
kripto_akis.Close();
dosya_akis.Close();
}
Bu kodu hazırladıktan sonra projeyi çalıştırıp formdaki RichTextBox’a bilgi aktarıp “Şifrele” başklıklı düğmeyi tıklayıp şifreleme işlemini tamamladık. Şifreleme işlemi sonucu hazırlanan dosyanın içeriği aşağıda verildi.

Bu şekilde şifreleme yaptıktan sonra şimdi deşifreleme yapacağız. Tahmin edeceğiniz gibi şifreli dosyayı gönderdiğiniz kişiye bir şekilde şifreleme anahtarını da göndermeniz gerekir. Bu örnekte anahtarı ve başlangıç verktörünü direk kodun içine yazdık.
Deşifreleme yapmak üzere forma 2. bir düğme ve RichTextBox nesnesi yerleştirip 2. düğme için benzer kodu yazdık. Bu kodda yukarıdakinden farklı olarak CryptoStreamnesnesinin CryptoStreamMode özelliğini Read olarak ayarladık ve FileStream’den başka ayrıca StreamReader nesnesinden yararlandık.
privatevoid desifre_Click(object sender, EventArgs e)
{
byte[] baslangic_vektor = byte_yap("12345678");
byte[] anahtar = byte_yap("87654321");
DESCryptoServiceProvider des_nesne = new DESCryptoServiceProvider();
ICryptoTransform arayuz = des_nesne.CreateDecryptor(anahtar, baslangic_vektor);
FileStream dosya_akis = new FileStream("c:\\sifreli.txt", FileMode.Open, FileAccess.Read);
CryptoStream kripto_stream = new CryptoStream(dosya_akis, arayuz, CryptoStreamMode.Read);
StreamReader okuyucu = new StreamReader(kripto_stream);
string str = okuyucu.ReadToEnd();
richTextBox2.Text = str;
okuyucu.Close();
dosya_akis.Close();
}
Ayrıca bu kodda ICryptoTransform nesnesini hazırlarken DESCryptoServiceProvider sınıfının CreateEncryptor() metodu yerine CreateDecryptor() metodunu kullandık. Aşağıda verilen ekran görüntüsü RichTextBox’a şifrelemek istenen bilgiler yazılıp önce Şifrele, sonra Deşifre başlıklı düğme tıklandıktan sonra alındı.

Şimdi bazı arkadaşlar “şifreleme işlemi bu kadar kolay yapılan ve kolay anlaşılan bir konu muydu?” diye kendi kendilerine soracaklardır. Kriptografi uzmanı olmak istemiyorsanız .NET dilleriyle bu işlem bu kadar kolaydır. Tabi ben "zorluk çekerek öğrenmeye alışığım" diyenler başka kaynaklara yani Türkçe yayınlanmış kitaplara başvurabilirler.