Makale Özeti

DESCryptoServiceProvider , FileStream , TripleDESCryptoSeviceProvider , CryptoStream , MD5CryptoServiceProvider Sınıfları ve bazı metodlarınıtanımlayıp , bir programda dosya şifreleme ve şifre çözme yapacağız.

Makale

using System.Security.Crytography;

Yukarıdaki kod verinin şifreleme ve şifre çözmesini içeren kripto servisleri sağlıyor.
Ayrıca yanında birçok diğer işlemleride içeriyor.Örneğin rasgele numara üretimi ,
ileti kimlik doğrulama gibi.

using System.IO;

Yukarıdaki kod klasör ve dosya işlemlerinde yazma ve okuma yapmak için bu namespace ait
fonksiyonlar kullanılır.

DESCryptoServiceProvider kripto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

Yukarıdaki kod , veri şifreleme standardı algoritmasının (DES) kripto servis sağlayıcısına (CSP)
için bir wrapper(sarmalayıcı) nesneyi tanımlıyor.
Create() metodu , simetrik Algoritmanın(tek yönlü şifreleme) bir örneği yaratılır.Kodumuzun içindeki anahtar değişkenini
otomatik olarak çalıştırır.

ASCIIEncoding.ASCII.GetString(kripto.Key);

Yukarıdaki kod şifre için otomatik oluşturulmuş anahtar'ı burada kullanırız.GetString() metodu ile string e
dönüştürme yaparız.ASCII , herbir string değitirmek için kullanırız.ASCIIEncoding class ise
Unicode karakterin , ASCII karakter kodlamasını gösteriyor.

OpenFileDialog ac = new OpenFileDialog();

Windows' un ortak iletişim formunu kullanarak dosya yükleme işemlerini gerçekleştirirler.

ac.ShowDialog();

Yukarıdaki metod opendialog pencerisinin açımasını sağlar.

ac.FileName;

Yukarıdaki kod , seçilen dosyanın yolunu belirler.

SaveFileDialog kaydet = new SaveFileDialog();

Yukarıdaki kod OpenFileDialog gibi Windows'un ortak iletişim formunu kullanarak , kullanıcıya ,
dosya kaydetmesine , bir dizin belirlemesine izin verir.

FileStream OkuStream = new FileStream(adres , FileMode.Open , FileAccess.Read);

Yukarıdaki kod disk üzerindeki dosyalar için Byte tabanlı kanal oluşturur.
Birinci parametre dosyanın diskteki adresidir.İkinci parametre ise belirtilen adresteki dosyayı açar
ve yazma işlemi yapılmak isteniyorsa daha önceki verinin üzerine yazar.Üçüncü parametre , dosya ,
FileStream nesnesi yoluyla nasıl erişilebilir karar veriyor.Burada bz okuma izni verdik.

OkuStream.Read(byte[],0,byteLength);

Yukarıdaki kod güvenli şekilde dosyayı okuyor.Bir döngü içerisinde kullanıyoruz.
En son OkuStream.Close() metodu kullanarak dosyayı kapatıyoruz.
Birinci parametre belirtilen byte dizisi okunacak olan yerdir.
İkinci parametre ise ilk önce 0 dizi okunarak sayaç halinde devam eder.
Üçüncü parametre sayacın çkabileceği en yüksek dizi sayısıdır.

TripleDESCryptoSeviceProvider TDCS= new TripleDESCryptoServiceProvider();

TripleDES algoritmanın kriptolama servis sağlayıcı sürümüne erişmek için a wrapper(sarmalayıcı)
nesneyi tanımlıyor.

TDCS.CreateEncryptor();
Bir simetrik(tek yönlü şifreleme) TripleDES şifreleyici , TDCS.Key'ı ile nesneyi yaratıyor.

TDCS.CreateDecryptor();
O anki anahtar özelliği ile , bir simetrik(tek yönlü) şifre çözme nesnesi yaratıyor

CryptoStream kriptoStream = new CryptoStream(YazmaStream,TDCS.CreateEncryptor(),CryptoStreamMode.Write);

Veri şifrelemek veya güvenli bir şekilde transfer etmek için gizli bir anahtar ile kullanılır.
İlk parametre , kripto dönüşümüne uğrayacak olan(şifreleme yada şifresini çözme) Stream nesnesidir.
İkinci parametre , kripto dönüşümü yapılmış ve Stream nesnesine yerleştirilmiş olmaktadır.
üçüncü parametre , Belirtilen Nesnemize yazma izni verilir.

kriptoStream.Write(byte[],0,byteLength);

kripto nesnesine byte'ların zincirini yazıyor.Birinci parametre bir byte[] dizisidir.
İkinci parametre 0 numarası o anki dizi sayısıdır.(pozisyonudur.)En yüksek üçüncü parametre'ye
kadar çıkar.Yani sayaç şeklinde bir bir arta arta çıkar.

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

Yukarıdaki kod Kriptografik Servis Sağlayıcı(CSP) yoluyla sağlanmış , uygulama
kullanarak , MD5 karma(hash) değerini hesaplıyor.Bu class .Net Hash Class'dır.Çoğunlukla şifre için kullanılır.
Verinin geri dönüşümü olmayan bir imza(signature) yaratıyor.Hash fonksiyonlar kullanyorsun.

md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(StrKarma));

Belirtilen byte[] dizisi için karma(hash) değeri hesaplıyor.

File.ReadAllBytes(adres);

Parametre olarak bir dosya adresi alıyor ve geriye dosya verisini dönüyor.Biraz daha açıklayıcı yapalım.
Binary(ikili) dosya açıyor.Bir byte[] dizi içine , dosyanın içindekileri okuyor.Sonunda dosyayı kapatıyor.

TDCS.Mode = CipherMode.ECB;

Simetrik(tek yönlü şifreleme) algoritmasının işlemi için mode'u ayarlıyor ve alıyor.
Simetrik algoritmanın işleri için mod var olan değeri CipherMode.CBC'dir.
CipherMode , Şifreleme için kullanmak için blok şifreleme modu (cipher mode)'u belirtiyor.
Biz CipherMode.ECB'yi kullandık.Bu ECB şifreleme pek önerilmez.

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
namespace folderbrowserdialog
{
    public partial class Form1 : Form
    {
        string anahtar;
        public Form1()
        {
            InitializeComponent();
            anahtar = anahtar_çalıştırma();
        }
        private string anahtar_çalıştırma()
        {

            DESCryptoServiceProvider kripto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
            return ASCIIEncoding.ASCII.GetString(kripto.Key);
        }

        private void button1_Click(object sender, EventArgs e)//Şifreleme butonu
        {
            OpenFileDialog ac = new OpenFileDialog();
            ac.ShowDialog();

            textBox1.Text = ac.FileName;//Disk üzerindeki şifrelenecek dosya dizini

            SaveFileDialog kaydet = new SaveFileDialog();
            kaydet.ShowDialog();

            textBox2.Text = kaydet.FileName;//Yeni dosya dizinine farklı kaydet yaptık.

            sifreleme(textBox1.Text, textBox2.Text, anahtar);//DES(anahtar_calisma fonksiyonu) ten gelen gizli anahtar burada kullanılır.
        }
        private void sifreleme(string adres, string yeniadres, string StrKarma)
        {
            
            TripleDESCryptoServiceProvider TDCS = new TripleDESCryptoServiceProvider();
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            FileStream OkuStream = new FileStream(adres, FileMode.Open, FileAccess.Read);
            FileStream YazmaStream = new FileStream(yeniadres, FileMode.OpenOrCreate, FileAccess.Write);
            byte[] Karma = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(StrKarma));
            byte[] Metin_Oku = File.ReadAllBytes(adres);

            md5.Clear();

            TDCS.Key = Karma;
            TDCS.Mode = CipherMode.ECB;

            CryptoStream kriptoStream = new CryptoStream(YazmaStream, TDCS.CreateEncryptor(), CryptoStreamMode.Write);
            int depo;
            long position = 0;
            while (position< OkuStream.Length)
            {
                depo=OkuStream.Read(Metin_Oku,0,Metin_Oku.Length);
                position += depo;

                kriptoStream.Write(Metin_Oku,0,depo);
            }

            OkuStream.Close();
            YazmaStream.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {

            OpenFileDialog ac = new OpenFileDialog();
            ac.ShowDialog();

            textBox3.Text = ac.FileName;//Disk üzerindeki şifre çözme dosya dizini

            SaveFileDialog kaydet = new SaveFileDialog();
            kaydet.ShowDialog();

            textBox4.Text = kaydet.FileName;//Yeni dosya dizinine farklı kaydet yaptık.

            sifreCozme(textBox3.Text, textBox4.Text, anahtar);
        }
        private void sifreCozme(string adres, string yeniadres, string StrKarma)
        {

            TripleDESCryptoServiceProvider TDCS = new TripleDESCryptoServiceProvider();
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            FileStream OkuStream = new FileStream(adres, FileMode.Open, FileAccess.Read);
            FileStream YazmaStream = new FileStream(yeniadres, FileMode.OpenOrCreate, FileAccess.Write);
            byte[] Karma = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(StrKarma));
            byte[] Metin_Oku = File.ReadAllBytes(adres);

            md5.Clear();

            TDCS.Key = Karma;
            TDCS.Mode = CipherMode.ECB;

            CryptoStream kriptoStream = new CryptoStream(YazmaStream, TDCS.CreateDecryptor(), CryptoStreamMode.Write);
            int depo;
            long position = 0;
            while (position < OkuStream.Length)
            {
                depo = OkuStream.Read(Metin_Oku, 0, Metin_Oku.Length);
                position += depo;

                kriptoStream.Write(Metin_Oku, 0, depo);
            }

            OkuStream.Close();
            YazmaStream.Close();
        }
    }
}

Çalışma Şekli : programı çalıştırınca button1 basarak şifrelemek istediğimiz bir dosyayı(resim dosyası, wordpad olabilir.notpad de gerçekleştiremedim) bularak ok basarız.İkinci gelen ekrana yeni dosya ismi girerek (uzantısını eklemeyi unutmayın) farklı kaydet yaparız.Şimdi farklı kaydettiğiniz dosyaya bakın.Gördüğünüz ya değişik karakterler ya da dosya görüntülenemiyor.Sırada şifreyi çözme ye geldi.Button2 'ye basarak , farklı kaydettiğimiz dosyayı bulur ve tamam'a basarız.Sonraki gelen ekran , isim girerek(uzantıyı koymayı unutmayın!) farklı kaydet yaparız ve sonra farklı kaydettiğimiz ikinci dosyayı açarak bilgilerimizi görmüş oluruz. Herkese iyi çalışmalar.