|
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
|
|