| 
                
             | 
        
        
            
                
                    
                        | 
                            XOR Operatörü ile Temel Bir Şifreleme Algoritması | 
                        
                             | 
                                
                     
                    
                        
                            
	
    
		
            | Gönderiliyor lütfen bekleyin... |   
        
	 
    
 
                         | 
                     
                 
             | 
        
        
            
                
                 
  Ş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 
             | 
        
        
            | 
             | 
        
        
            | 
                 
             | 
        
        
            
                
                
                    
                        - 
                            
                        
 
                        - 
                            
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
                         
                     
                 
                
                
             | 
        
        
            | 
                
             |