C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 11.03.2005
Okunma Sayısı : 25344
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
uğur erdem
Alert - Jquery -ASP.NET
uğur erdem
yazının devamı >
oguzhan abalı
Silverlight'da Animation İşlemleri - Örnek Uygulama
oguzhan abalı
yazının devamı >
uğur erdem
Geliştirdiğimiz Windows Servisin Kurulumu Tamamlandıktan Sonra Çalışması
uğur erdem
yazının devamı >
Mehmet KAPLAN
WPF - Windows 7 Görev Çubuğu Programlama
Mehmet KAPLAN
yazının devamı >
Çağlar ÖZENÇ
SQL Server Express Utiliy SSEUTil.exe kullanın..
Çağlar ÖZENÇ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
Çoklu Dil Desteği – Veri Tabanı Tasarım Örnekleri ile 24.04.2014
Turhal Temizer 'in Blogu
Qualcomm - MU Mimo (Multi User MIMO) 24.04.2014
Burak Selim Senyurt
Entity Framework 6 –Yeni Esintiler 09.04.2014
Burak Selim Senyurt
C# 6.0–Yeni Esintiler 04.04.2014
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
XOR Operatörü ile Temel Bir Şifreleme Algoritması
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

Şifreleme günümüzde güvenli iletişim için çok önemli bir konuma gelmiştir, uzun yıllardan beri çok fazla şifreleme algortiması geliştirilmiştir. Bu şifreleme algoritmalarının bir çoğu .NET sınıf kütüphanesinde zaten varsayılan olarak bulunmaktadır, bu yazıda ise kendi şifreleme algortimalarımızı nasıl oluşturabileceğimiz görmek açısından temel bir şifreleme algoritmasını sizlere göstereceğim.

Bir mesajın yada metnin şifrelenmesi genellikle şifrelenecek mesajın çeşitli operatörler yardımıyla farklı mesajlara dönüştürülmesi ile olmaktadır. Burada bilmemiz gereken nokta şudur : şifrelenecek mesaj ile şifrelenmiş mesajın aynı alfabeden sözcükleri içermesidir. Örneğin ikili(binary) sayılardan oluşturulan bir mesaj şifrelendiği takdirde yine ikili bir sayı olacaktır. Şifreleme yapılırken genellikle anahtar dedğimiz yardımcı bir mesajdan faydalanır. Mesajın şifrelenmesi bu anahtar ile gerçekleşmektedir. Aynı şekilde şifrelenmiş mesajın çözülmesinde de bu anahtar kullanılmaktadır. Şifreleme işlemi ise bir yada daha fazla operatör sayesinde yapılmaktadır. Buradaki operatörler tekil bir operatör olabileceği gibi kullanıcının tanımlayacağı karmaşık değişkenli operatörler de olabilir.

Şifreleme programını yazanlar genellikle şifreyi çözen programıda yazmak zorunda kalırlar. Nede olsa şifreler çözülmek içindir. Çözülemeyen şifreli mesajların pek bir anlamı olmayacağı açıktır. Her ne kadar şifreleme ve şifre çözme programları birbirnin tersi de olsa iki farklı program yazmak yinede zaman kaybettirir. Aynı programın hem şifreleyici hemde şifre çözücü olduğu bir sistem herhalde hepimizin ilgisini çekecektir. Bu yazıda hem şifre çözücü hemde şifreleme işine yarayacak özel bir operatör olan XOR(Bitsel Özel Veya) operatörünü ve bu operatörü kullanarak nasıl şifreleyici ve aynı zamanda şifre çözücü bir programı geliştirebileceğimizi inceleyeceğiz.

XOR(Bitsel Özel Veya) Operatörü

"Özel veya" operatörü iki operandı olan bir operatördür. Özel veya operatörü aldığı operandlarının bütün bitlerini karşılıklı olarak "özel veya(XOR)" işlemine tutar. İsterseniz birçoğumzun matematik derslerinden hatırlayacağı "özel veya" yani XOR işleminin tanımını görelim. Özel veya operatörü iki operand aldığı için dört farklı durum sözkonusudur. Bu durumlar ve sonuçları aşağıdaki tabloda belirtilmiştir.



Operand 1
Operand 2
Sonuç
1
1
0
1
0
1
0
1
1
0
0
0
Tablodan da görüldüğü özere XOR operatörünün sonucu ancak ve ancak her iki operand da birbirinden farklıysa 1 değerini almaktadır. Bu sonuç bize şifreleme algoritmasında büyük bir kolaylık sağlayacaktır. XOR operatörü bitsel bir operatör olduğu için her iki operandın da ikili bir sayı olması gerekir. C#’taki veri türleri ile XOR operatörü kullanıldığında veriyi oluşturan her bir değişkenin bütün bitleri karşılıklı olarak XOR işlemine tabi tutulur. Örneğin byte türünden 1 sayısı ile yine byte türünden 2 sayının XOR işlemin sonra hangi değeri oluşturacağını görelim.

Öncelikle 1 ve 2 sayısının bitsel açılımını yazalım :

Not : 1 byte büyüklüğünün 8 bite denk düştüğünü hatırlayalım.

1 --> 0 0 0 0   0 0 0 1

2 --> 0 0 0 0   0 0 1 0

--------------------- 1 ^ 2 (Not : XOR operatörünün simgesi ^ karakteridir.)

3 --> 0 0 0 0   0 0 1 1

Dolayısıyla 1 ve 2 değerini XOR işlemine tabi tutarsak 3 değerini elde ederiz. Bu sonucu programlama yoluyla elde etmek için bir konsol uygulaması açın ve aşağıdaki ifadeyi ekrana yazdırın.

Console.WriteLine((1^2));

XOR operatörünün diğer önemli bir özelliği ise geri dönüşümlü bir operatör olmasıdır. Yani bir sayıyı "özel veya" işlemine tabi tuttuktan sonra sonucu yine aynı sayı ile "özel veya" işlemine tabi tutarsak başlangıçtaki sonucu elde ederiz. Örneğin 3 sayısını 1 ile "özel veya" işlemine tabi tutarsak 2 sayısını, 2 ile "özel veya" işlemine tabi tutarsak bu sefer 1 sayısını elde ederiz. Bu özelliği bir formül ile gösterirsek;

x = z ^ b;

y = x ^ b;

ise

z = y dir.

XOR işleminin bu özelli yazdığımız programa hem şifre çözücü hemde şifreleyici olma özelliği katacaktır.


Şifreleyici ve Şifre Çözücü Program

Bu bölümde şifre çözücü ve aynı zamanda şifreleyeci programı XOR operatörünü kullanarak geliştireceğiz. Program bir dosya şifreleyicisi ve şifre çözücüsü olarak kullanılacaktır. Şifrelenecek dosya bir metin dosyası, çalıştırılabilir exe dosyası olabileceği gibi bir video ve resim dosyasıda olabilir. Çünkü XOR işlemini dosyayı oluşturan byte’lar düzeyinde gerçekleştireceğiz. Şifreleme işlemi yaparken dosyadaki her bir byte sırayla kullanıcının gireceği bir anahtardan elde edilen sayı ile XOR işlemine tabi tutulacaktır. XOR işlemi sayesinde yazdığımız program aynı zamanda bir şifre çözücü program olarak ta çalışacaktır. İlk olarak programımızın en temel halini yazalım ardından programız üzerinde iyileştirme çalışması yapacağız.

Kaynak kodları aşağıda verilen programı yazın ve derleyin.


using System;
using System.IO; namespace XOR
{
   class csharpnedir
   {
      static void Main(string[] args)
      {
         if(args.Length != 2)
         {
            Console.WriteLine("Hatalı kullanım");
            Console.WriteLine("Örnek kullanım : Sifrele xx.text anahtar");
            return ;
         }

         string kaynakDosya = args[0];
         string hedefDosya = args[1];
         string anahtar = "";

         Console.Write("Anahtarı girin :");
         anahtar = Console.ReadLine();

         int XOR = 0;

         for(int i = 0; i             XOR = XOR + (int)(anahtar[i]);

         FileStream fsKaynakDosya = new FileStream(kaynakDosya,FileMode.Open);
         FileStream fsHedefDosya = new FileStream(hedefDosya,FileMode.CreateNew | FileMode.CreateNew,FileAccess.Write);

         int kaynakByte;//(3 byte’lık 0 dizisi + kaynakByte)
         byte hedefByte;

         while((kaynakByte = fsKaynakDosya.ReadByte()) != -1)
         {
            hedefByte = (byte)((int)kaynakByte ^ XOR);
            fsHedefDosya.WriteByte(hedefByte);
         }

         fsHedefDosya.Close();
         fsKaynakDosya.Close();
      }
   }
}


Hemen programın sonucunu görelim :

Aşağıdaki gibi gizlilik derecesi yüksek olan bir metin dosyası oluşturun.



Not : Şifrelenecek dosyanın metin tabanlı olması zorunlu değildir. Çünkü şifreleme işlemini karakter tabanlı değil byte düzeyinde yapmaktayız. Ama sonuçlarını daha iyi görebilmek için örneği metin tabanlı dosya üzerinde gösteriyorum.

Programı aşağıdaki gibi komut satırından çalıştırın.



Programı çalıştırdıktan sonra oluşturulan Sifreli isimli dosyayı Notepad programında görüntülediğimizde aşağıdaki gibi bir ekran ike karşılaşırız.



Dikkat edin, şifreleme işlemini byte düzeyinde yaptığımız için şifreli dosya artık metin dosyası değil binary bir dosya haline gelmiştir.

Şifrelenmiş dosyayı tekrar eski haline getirmek için tek yapmamız gereken komut satırından şifreleme programını diğer bir deyişle şifre çözücü programını çalıştırmamız gerekir. Anahtar olarak ta tabiki şifrelemede kullandığımız anahtar kullanmamız gerekir. Komut satırından aşağıdaki gibi programı çalıştırdığımızda orjinal metin dosyasını elde edebiliriz.

XOR SifreliMesaj OrjinalMesaj.txt
Anahtarı Girin : XkuksAh

Gördüğünz gibi programımız hem şifreleyici hemde şifre çözücü olarak kullanılabilmektedir.

Sonuçlar

Dikkat ederseniz mesaj dosyasının her byte değeri sabit bir değerle karşılıklı olarak XOR işlemine tabi tutulmuştur. XOR işlemine tabi tutulan değer kullanıcı tarafından girilen anahtardan oluşturulmuştur. Anahtar değerin her bi karakterinin ASCII karşılığı toplanarak elde edilen değer XOR işleminin sabit operandı olarak ele alınmıştır. Ancak programımızda ufak bir sorun var. Çünkü şifrelemek için girilen anahtar değerini oluşturan karakterlerin hepsini içerecek şekilde oluşturulan bütün kombinasyonlar şifrelenmiş dosyayı çözecektir. Örneğin şifrelemek için kullanılan anahtar değerin "AxyHMnK2" olduğunu düşünelim. Bu durumda "xynAHMNK2" ve "2MnKHyxA" gibi kombinasyonlar dosyanın çözülmesini sağlayacaktır.

Yukarıda bahsi geçen kısıtı engellemek için XOR işlemine tabi tutulacak operandı anahtar değerden elde ederlen farklı bir yöntem kullanılır. Bu operandı aşağıdaki gibi yeniden elde edebiliriz.


int XOR = 0;

for(int i = 0; i      XOR = XOR + (int)(anahtar[i] * 10);

Yukarıdaki düzenlmeye rağmen şifreyi çözecek anahtar tek değildir. Çünkü farklı karakter kombinasyonlarının toplamı çok düşük bir ihtimalde olsa orjinal XOR değerine eşit olabilir. Ancak bu durum şifreleme tekniğinin güvenirliğini azaltmaz. Çünkü orjinal XOR değerinin tahmin etme olsaılığı çok azdır.

Gelelim diğer bir kısıta : Dikkat ederseniz şifreleme yaparken dosyadaki her bir byte değerini sabit bir değerle XOR işlemine tabi tuttuk. Bir byte değişkenin sınırları 0- 255 arası olduğu için şifreleme programını çözmek için en fazla 256 ihtimal vardır. Tabi burada anahtar değerden XOR işlemine tabi tutulacak değerin nasıl elde edildiğinin bilindiği varsayılmaktadır. Eğer bu yöntem bilinmiyorsa şifrenin çözülme olasılığı neredeyse imkansızdır. XOR operandının elde edilme yönteminin bilindiği varsayımı altında 256 sayısını yani şifrenenin çözülme olasılığını azaltmak için yapmamız gereken XOR işlemini 1 byte’lık bloklar yerine daha büyük bloklar ile yapmaktır. Örneğin XOR işlemini 4 byte lık veri blokları ile yaptığımızda XOR işleminin operandı 4.294.967.296 ihtimalden birisidir. Eğer XOR işlemine sokulan veri bloğu artırılırsa operandın alabileceği değerler üstel bir biçimde artacaktır. Bu arada XOR işlemine sokulacak veri bloklarının sayısı arttıkça xor işlemindeki operandın değerini belirlemek için farklı yöntemler kullanılmalıdır. Çünkü eğer aşağıdaki yöntemde elde edilen XOR operandını kullanırsak 1 byte yada 4 byte’lık verilerle çalışmanın çok önemli bir farkı olmayacaktır. (Burada fark, girilen anahtara göre belirlenir. Örneğin oluşturulan xor operandı 256 değerinden küçük ise hiç bir fark meydana gelmeyecektir.)


int XOR = 0;

for(int i = 0; i      XOR = XOR + (int)(anahtar[i]);

Bu yöntemle geliştirilecek bir şifreleme programını daha etkili hale getirmek için bir yöntem daha vardır. Programı incelerseniz her bir byte bloğunu sabit bir değerle xor işlemine soktuk. Bu aslında biraz risklidir. Zira büyük bir şifreli metnin çok küçük bölümünün çözülmesi tamamının çözülmesi anlamına gelir. Bu yüzden her bir byte bloğunu farklı bir değerle xor işlemine tabi tutarsak şifreli metnin her bir şifreli bloğu bir diğerinden bağımsız hale gelir. Yani çözülmüş bir şifreli blok diğer bloğun çözülmesine kesin bir bilgi vermez. Dolayısıyla şifre krıcı programların lineer bir yöntem izlemesi engellenmiş olur.

Bu tür bir şifreleme yönteminin devlet düzeyinde güvenli olması gereken mesajlarda kullanılması uygun olmasada mesajların başkaları tarafından açıkca görülmeden haberleşme sistemlerinden geçirilmesi için uygun bir yöntemdir. Elbetteki daha basit yöntemlerle de bu işlemi gerçekleştirebiliriz ancak bu yöntemin en önemli özelliği hem şifreleme hemde şifre çözücü olarak kullanılabilmesidir.

Bu yazının kendi şifreleme algortimalarınızı oluşturmada size yol gösterebileceğini umuyor iyi çalışmalar diliyorum.

Makale:
XOR Operatörü ile Temel Bir Şifreleme Algoritması C#, Visual C# ve .NET Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
ŞUB
11
2004
ilginiz için teşekkürler..evet tabloda bir hata var.. ancak 1^1 = 0 doğru.yanlış olan 0^0 = 1 satırı..bu da 0 olmalı.
ŞUB
11
2004
Oncelikle kendi adıma tesekkur ederim. Makalelerinizin ve sizin takipcinizim. Sizden cok sey ogreniyorum. Bu arada 1 ^ 1 = 1 0 ^ 0 = 0 deil midir..
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor