Bu yazımda, 3DES (Triple Des) algoritmasının çalışma mantığını kısaca anlattıktan sonra C# ile bir şifreleme ve şifre çözme uygulaması yapacağız.
3Des algoritması, Des algoritmasının ardarda üç kez çalıştırılması ile elde edilmiştir. O yüzden 3DES algoritmasına geçmeden önce, DES algoritması hakkında kısa bilgi vermekte fayda var. DES algoritması block cipher mantığına göre çalışır, yani veriler bir anahtar yardımıyla bloklar halinde şifrelenir. Anahtar ne kadar uzunsa şifreyi çözmekte o kadar zor olacaktır. Des algoritmasında anahtar uzunluğu 56 bittir. Bu anahtar özellikle günümüz işlemci hızları göz önüne alındığında, brute force saldırılarına belli bir süre dayanabilir. Bu nedenle artık bu algoritma yerini 3DES ve AES algoritmalarına bırakmıştır.
IBM firması, DES algoritmasının eksikliklerini, yeni bir şifreleme algoritması tasarlamadan gidermeye çalıştı. Öncelikle DES algoritmasının en zayıf noktası olan Sbox açıkları giderildi. Ardından bu algoritma ardarda üç defa işleme konarak, 3DES algoritması oluşturuldu. 3DES algoritması çift taraflı çalışır yani şifrelenen veri, bir anahtar yardımıyla tekrar çözülebilir. Anahtar 24 byte uzunluğundadır. Hesaplarsak 24×8 =192 bit eder, her byte’in 1 biti eşlik biti olarak kullanıldığından 192-24=168 bit elde edilir. Yani DES’teki 56 bitlik anahtarın tam tamına 3 katı bir anahtar uzunluğu elde edilmiş olur. Bu algoritmanın dezavantajı ise, Des işlemi 3 kez yapıldığı için üç kat daha yavaş çalışmasıdır. Günümüzde halen bankacılık, elektronik ödeme sistemi, yazılım anahtarı oluşturma gibi yerlerde kullanım alanı bulmaktadır.
Şimdide uygulamamızı nasıl yapacağımıza gelelim.
Uygulamamız şu şekilde çalışacak. Bir metni şifreleyerek bilgisayarımızdaki bir dosyaya kaydedeceğiz. Sonra bu dosyadan şifreli metni alıp, şifresini çözerek tekrar metnimizin ilk halini elde etmeye çalışacağız.
İşlemleri gerçekleştirmek için Sifreleme adından bir sınıf oluşturdum. Sınıfın içerisinde ki sifrele ve sifrecoz adındaki iki adet metod işlemleri gerçekleştiriyor.
Öncelikle uygulamamıza şifreleme ve dosya işlemleri için gerekli olan üst satırdaki namespaceleri eklemeyi unutmayın. Kodların açıklamalarını kod aralarına açıklama olarak ekledim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; // Şifreleme işlemleri bu namespace kullanılarak yapılıyor. using System.IO; public class Sifreleme { //Şifreleme yapan fonksiyonumuzun ismi sifrele dikkat ederseniz 3 parametre alıyor. //1.parametre şifrelenecek metnimiz,2.parametre şifre anahtarımız,3.parametre metni kaydedeceğimiz dosyanın yolu public void sifrele(string veri, string anahtar24, string dyolu) { try { FileStream fs = new FileStream(dyolu, FileMode.OpenOrCreate, FileAccess.Write); //Dosyayı kaydetmek için bir filestream nesnesi oluşturduk. byte[] key = Encoding.ASCII.GetBytes(anahtar24); //parametreyle gelen anahtarı aldık ve byte dizisine atadık byte[] iv = { 04, 21, 70, 30, 32, 04, 21, 70 }; //Vektörü 8 byte olarak belirledik. byte[] d = Encoding.Default.GetBytes(veri); //parametreyle gelen string türündeki şifrelenecek metni byte dizisine atadık TripleDES servis = new TripleDESCryptoServiceProvider(); CryptoStream sifreyaz = new CryptoStream(fs, servis.CreateEncryptor(key, iv), CryptoStreamMode.Write); //TripleDes kripto servisini çağırdık.Cryptostream 3 parametreyle çalışıyor.Bu kısım can alıcı nokta //iyice inceleyin.Şifrelenecek Filestream,Şifreleme fonksiyonu anahtar ve vektörle çalışıyor.Cryptomuz //yazma modunda çalışıyor. sifreyaz.Write(d, 0, d.Length); //Crypto streami dosyaya yazıyoruz. sifreyaz.Close(); fs.Close(); } catch { } } //Şimdide kaydedilen şifreyi çözmek için sifrecoz fonksiyonumuzu oluşturalım.Bu fonksiyona şifrelenmiş dosyanın yolunu //ve şifreyi çözmekte kullanılan anahtarımızı giriyoruz. public string sifrecoz(string dyol, string anahtar24) { StringBuilder SB = new StringBuilder(); try { FileStream fs = new FileStream(dyol, FileMode.Open, FileAccess.Read); //Filestream oluşturup dosyayı kaydettiğimiz yerden okutuyoruz. byte[] key = Encoding.ASCII.GetBytes(anahtar24); //fonsiyona parametreyle gelen şifrelerken kullandığımız anaktarı tanımlıyoruz. byte[] iv = { 04, 21, 70, 30, 32, 04, 21, 70 }; //Yukarda kullandığımız vektörün aynısını kullanmak zorundayız. TripleDES sifrele = new TripleDESCryptoServiceProvider(); CryptoStream sifrecoz = new CryptoStream(fs, sifrele.CreateDecryptor(key, iv), CryptoStreamMode.Read); //Bu kısımda şifrelenmis veri decrypt ediliyor yani çözülüyor. //Bu sefer şifrelemeden farklı olarak ŞifreÇözme fonksiyonu kullanılıyor ve Crpto okuma modunda int ch; for (int i = 0; i < fs.Length; i++) { ch = sifrecoz.ReadByte(); if (ch == -1) break; SB.Append(Convert.ToChar(ch)); } //Yukardaki kod bloğunda şifresi çözülen her karakter tek tek okunarak string builder yardımıyla arka arkaya //ekleniyor.Taki karakter kalmayana dek. fs.Close(); sifrecoz.Close(); } catch { } return SB.ToString(); } } |
Sınıfımız hazır şimdi bir form yardımıyla şifreleme işlemini nasıl yapacağımızı anlatayım. Aşağıdaki formu oluşturuyoruz. Çalışma mantığı şu şekilde olacak. TextBox’a şifrelenmesini istediğimiz metni yazacağız ve şifrele düğmesine tıkladığımızda metnimiz şifrelenerek “C:” dizini içerisine sifreli.txt dosyası içerisine kaydedilecek.
Bu işlemleri yapacak olan kodları Şifrele düğmesine tıklayarak yazalım.
1 2 3 4 5 6 7 8 9 10 11 |
Sifreleme sifre = new Sifreleme(); //Yazdığımız classimizdan bir örnek oluştrduk. private void sifrele_Click(object sender, EventArgs e) { string anahtar="A96E6945H9658J1246XM43R1"; //24 byte değerinde şifre oluşturuyoruz.Sadece bu şifreyle veriyi eski haline döndürebiliriz. string kayityolu="C://sifreli.txt"; //Şifreli metni nereye kaydedeceğimizi belirliyoruz. sifre.sifrele(sifrelenecektxt.Text, anahtar, kayityolu); //Yazdığımız fonksiyonu çağırdık.Gerisini o helledecek. } |
1 2 3 4 5 6 7 8 9 10 |
private void sifrecoz_Click(object sender, EventArgs e) { string anahtar = "A96E6945H9658J1246XM43R1"; //Şifrelenen dosyayı açmak için şifrelerken kullandığımız anahtarı belirtiyoruz. string kayityolu="C://sifreli.txt"; //Şifreli dosyanın yolunu belirliyoruz. goster.Text= sifre.sifrecoz(kayityolu, anahtar); //Yazdığımız sifreçöz fonksiyonunu çağırıyoruz.Geriye dönüş değeri string türünde olduğu için //kolaylıkla çözülen metni label da gösterebiliriz. } |