17 Aralık 2012 Pazartesi

C# ile Basit Dosya Şifreleme

 Merhaba Webkolog okuyucuları!

Günümüzde veri güvenliği, yazılım geliştirmenin en önemli konularından biri. Uygulamalarımızda hassas verileri saklarken veya aktarırken, bu verilerin yetkisiz erişime karşı korunması kritik bir rol oynuyor. Bugün sizlerle C# .NET Framework 4 ve Microsoft Visual Studio 2010 kullanarak XOR algoritmasıyla basit bir dosya şifreleme ve şifre çözme mekanizması nasıl oluşturacağımızı inceleyeceğiz.

Unutmayın, burada anlatacağım yöntem basit bir başlangıç içindir ve çok yüksek güvenlik gerektiren projelerde kullanılmamalıdır. Bu, XOR algoritmasının nasıl çalıştığını ve dosya işlemleriyle nasıl birleştirilebileceğini anlamanıza yardımcı olacak temel bir örnektir. Gerçek dünya uygulamalarında genellikle AES (Advanced Encryption Standard) gibi endüstri standardı şifreleme algoritmaları tercih edilir.

XOR Şifrelemesi Nedir?

XOR (Exclusive OR), ikili (binary) bir mantık işlemidir. İki girişin birbirinden farklı olması durumunda true (veya 1), aynı olması durumunda false (veya 0) döndürür. Şifreleme bağlamında, XOR'un en önemli özelliği, aynı anahtarla iki kez uygulandığında orijinal veriyi geri vermesidir:

  • A XOR B = C
  • C XOR B = A (yani, (A XOR B) XOR B = A)

Bu özelliği sayesinde, aynı XOR anahtarını kullanarak hem şifreleme hem de şifre çözme işlemini yapabiliriz.

Dosya Şifreleme Mekanizması

Şimdi, bu basit XOR mantığını bir dosyayı şifrelemek için nasıl kullanacağımıza bakalım. Öncelikle, bir anahtar belirleyeceğiz ve bu anahtarın karakterlerinin ASCII/Unicode değerlerini toplayarak tek bir XOR değeri elde edeceğiz. Ardından, dosyanın her bir baytını bu XOR değeriyle işleyeceğiz.

Şifreleme Kodu

Aşağıdaki kodu, bir Windows Forms uygulamasında (örneğin, bir buton tıklamasına) veya bir konsol uygulamasında kullanabilirsiniz:

using System;
using System.IO; // Dosya işlemleri için gerekli
 
public class FileEncryptorDecryptor
{
    // Şifreleme/çözme anahtarı
    private string anahtar = "Webkolog"; // Lütfen bu anahtarı daha karmaşık ve güvenli yapın!
 
    // Anahtardan elde edilen XOR değeri
    private int xorDegeri;
 
    public FileEncryptorDecryptor()
    {
        // Anahtarın karakter değerlerinin toplamını alarak XOR değerini hesapla
        xorDegeri = 0;
        for (int i = 0; i < anahtar.Length; i++)
        {
            xorDegeri = xorDegeri + (int)(anahtar[i]);
        }
    }
 
    /// 
    /// Belirtilen dosyayı XOR algoritmasıyla şifreler.
    /// 
    /// Şifrelenecek dosyanın tam yolu.
    /// Şifrelenmiş dosyanın kaydedileceği tam yol.
    public void SifreleDosya(string kaynakDosyaYolu, string hedefDosyaYolu)
    {
        FileStream fsKaynakDosya = null;
        FileStream fsHedefDosya = null;
 
        try
        {
            // Kaynak dosyayı okuma modunda aç
            fsKaynakDosya = new FileStream(kaynakDosyaYolu, FileMode.Open, FileAccess.Read);
            // Hedef dosyayı yazma modunda oluştur/aç.
            // FileMode.CreateNew: Dosya yoksa oluşturur, varsa hata verir.
            // Bu örnekte, var olan dosyayı ezecek şekilde FileMode.Create kullanabiliriz.
            fsHedefDosya = new FileStream(hedefDosyaYolu, FileMode.Create, FileAccess.Write);
 
            int kaynakByte;
            byte hedefByte;
 
            // Kaynak dosyanın her bir baytını oku
            while ((kaynakByte = fsKaynakDosya.ReadByte()) != -1)
            {
                // Her baytı XOR değeriyle şifrele
                hedefByte = (byte)((int)kaynakByte ^ xorDegeri);
                // Şifrelenmiş baytı hedef dosyaya yaz
                fsHedefDosya.WriteByte(hedefByte);
            }
 
            MessageBox.Show("Dosya başarıyla şifrelendi!", "Başarılı", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("Kaynak dosya bulunamadı: " + kaynakDosyaYolu, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Dosya şifreleme sırasında bir hata oluştu: " + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            // Dosya akışlarını kapatmayı unutmayın!
            if (fsHedefDosya != null) fsHedefDosya.Close();
            if (fsKaynakDosya != null) fsKaynakDosya.Close();
        }
    }
}
 

Bu kod parçası, FileStream kullanarak kaynak dosyayı bayt bayt okur ve her baytı hesapladığımız xorDegeri ile XOR işlemine tabi tutar. Sonucu da yeni bir hedef dosyaya yazar.

Dosya Şifre Çözme Mekanizması

XOR'un bahsettiğim (A XOR B) XOR B = A özelliğinden dolayı, şifre çözme işlemi için tamamen aynı algoritmayı ve aynı anahtarı kullanacağız. Şifreleme ile aynı mantıkla, şifrelenmiş dosyanın her baytını aynı XOR değeriyle tekrar işleyerek orijinal veriye ulaşacağız.

Şifre Çözme Kodu

Şifre çözme metodu da FileEncryptorDecryptor sınıfının içine eklenebilir:

using System;
using System.IO;
using System.Windows.Forms; // MessageBox için gerekli
 
public class FileEncryptorDecryptor
{
    // ... (yukarıdaki anahtar ve xorDegeri tanımlamaları aynı kalır) ...
 
    public FileEncryptorDecryptor()
    {
        // Anahtarın karakter değerlerinin toplamını alarak XOR değerini hesapla
        xorDegeri = 0;
        for (int i = 0; i < anahtar.Length; i++)
        {
            xorDegeri = xorDegeri + (int)(anahtar[i]);
        }
    }
 
    // ... (SifreleDosya metodu da yukarıdaki gibi aynı kalır) ...
 
    /// 
    /// Belirtilen XOR şifreli dosyayı çözer.
    /// 
    /// Şifre çözülecek dosyanın tam yolu.
    /// Şifre çözülmüş dosyanın kaydedileceği tam yol.
    public void CozumleDosya(string sifreliDosyaYolu, string ciktiDosyaYolu)
    {
        FileStream fsSifreliDosya = null;
        FileStream fsCiktiDosya = null;
 
        try
        {
            // Şifreli dosyayı okuma modunda aç
            fsSifreliDosya = new FileStream(sifreliDosyaYolu, FileMode.Open, FileAccess.Read);
            // Çözülmüş dosyanın kaydedileceği hedef dosyayı oluştur/aç
            fsCiktiDosya = new FileStream(ciktiDosyaYolu, FileMode.Create, FileAccess.Write);
 
            int sifreliByte;
            byte cozulmusByte;
 
            // Şifreli dosyanın her bir baytını oku
            while ((sifreliByte = fsSifreliDosya.ReadByte()) != -1)
            {
                // Her baytı aynı XOR değeriyle tekrar işlemden geçir (şifre çözme)
                cozulmusByte = (byte)((int)sifreliByte ^ xorDegeri);
                // Çözülmüş baytı hedef dosyaya yaz
                fsCiktiDosya.WriteByte(cozulmusByte);
            }
 
            MessageBox.Show("Dosya başarıyla çözüldü!", "Başarılı", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("Şifreli dosya bulunamadı: " + sifreliDosyaYolu, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Dosya şifre çözme sırasında bir hata oluştu: " + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            // Dosya akışlarını kapatmayı unutmayın!
            if (fsCiktiDosya != null) fsCiktiDosya.Close();
            if (fsSifreliDosya != null) fsSifreliDosya.Close();
        }
    }
}
 

Kullanım Örneği

Bu sınıfları projenizde nasıl kullanacağınızı göstermek için basit bir konsol uygulaması örneği:

class Program
{
    static void Main(string[] args)
    {
        // Dosya yolu örnekleri (kendi bilgisayarınızdaki yolları kullanın)
        string orijinalDosya = "C:\\test\\orijinal.txt";
        string sifreliDosya = "C:\\test\\sifreli.enc";
        string cozulmusDosya = "C:\\test\\cozulmus.txt";
 
        // FileEncryptorDecryptor sınıfının bir örneğini oluştur
        FileEncryptorDecryptor encryptor = new FileEncryptorDecryptor();
 
        // Dosyayı şifrele
        Console.WriteLine("Dosya şifreleniyor...");
        encryptor.SifreleDosya(orijinalDosya, sifreliDosya);
        Console.WriteLine("Şifreleme tamamlandı.");
 
        Console.WriteLine("\nDosya çözülüyor...");
        // Şifreli dosyayı çöz
        encryptor.CozumleDosya(sifreliDosya, cozulmusDosya);
        Console.WriteLine("Şifre çözme tamamlandı.");
 
        Console.ReadLine(); // Konsolun kapanmaması için
    }
}
 

Bu örnekte, C:\test\ klasöründe orijinal.txt adında bir dosyanız olduğunu varsayıyorum. Uygulama, bu dosyayı şifreleyip sifreli.enc olarak kaydedecek, ardından sifreli.enc dosyasını çözüp cozulmus.txt olarak kaydedecektir. orijinal.txt ve cozulmus.txt dosyalarının içeriği aynı olmalıdır.

Önemli Güvenlik Notları

Tekrar belirtmek isterim ki, bu XOR tabanlı şifreleme yöntemi basittir ve yüksek güvenlik gerektiren durumlar için uygun değildir. Sebepleri:

  • Tekrarlayan Anahtar: Her bayt aynı anahtarla işlenir, bu da frekans analizi gibi basit yöntemlerle şifrenin kırılmasını kolaylaştırır.
  • Anahtar Yönetimi: Anahtarın kodun içinde sabit olması, anahtarın kolayca ele geçirilmesine neden olabilir.
  • Hash/Salt Yok: Şifreleme anahtarının türetilmesinde veya verinin doğruluğunu kontrol etmede herhangi bir hash veya salt kullanılmaz.

Gerçek dünya uygulamalarında, .NET Framework'ün sunduğu System.Security.Cryptography namespace'i altındaki AES (Advanced Encryption Standard), RSA gibi güçlü algoritmaları kullanmanız şiddetle tavsiye edilir. Bu algoritmalar çok daha karmaşık matematiksel işlemler kullanır ve anahtar yönetimi için daha güvenli yöntemler sunar.

Umarım bu makale, dosyaları temel seviyede nasıl şifreleyip çözebileceğiniz konusunda size bir başlangıç noktası sunmuştur. Veri güvenliği konusunda daima en güncel ve güçlü algoritmaları araştırmayı ve kullanmayı unutmayın!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve güvenli projeler dilerim!

0 yorum:

Yorum Gönder