Ev Yapımı Şifreleme
![]()
Merhaba.Bugün size Python ile ev yapımı şifreleme nasıl yapılır ondan bahsedeceğim. Ev yapımı şifrelemeden neyi kastettiğimi yazının devamında daha rahat anlayacaksınız.(Not: Yazar girişte başlığı kullanarak merak uyandırmaya çalışmış ve okuyucuyu yazının devamını okuması için teşvik etmeye çalışmıştır).Programı görmeden önce size bu programı nerede kullanabileceğinizden bahsedeceğim, programın bu bilgiyle incelendiğinde daha kolay anlaşılacağını düşünüyorum.
Bir uygulama geliştirdiniz. Uygulamanız kullanıcı adı ve şifre girişi gerektirmekte ve sizde bu kullanıcı adını ve şifreyi kullanıcının bilgisayarında tutmak durumundasınız. Sadece bir kullanıcının kullanıcı adı ve şifresini tutmak içinde veritabanı kullanmak istemiyorsunuz. Bu durumda bu bilgileri bir dosyada tutmanız gerek. Buraya kadar her şey normal. Sorun bu bilgileri o dosyada nasıl tutacağınız. Bir dosya oluşturup içerisine pattadanak (böylemi yazılıyor bu?) yazacak değilsiniz. Bu kadarla da kalmıyorsunuz programınız kullanıcınızın izni dışında 3. şahıslar tarafından kopyalandığında da o 3. şahıs programını çaldığı kullanıcınızın bilgileri ile giriş yapamasın istiyorsunuz, yok artık!!! İşte bu yazıda böyle bir ihtiyaç durumunda kullanabileceğiniz bir şifreleme yönteminden, kendi verdiğim isimle “Ev Yapımı Şifreleme” den bahsedeceğim.
Çok konuştuk, kodu görelim. Önce kodun tamamını verip daha sonra parça parça açıklamasını vereceğim.
import operator import sys,os class Encrypt(): def xor(self, password,encrypt=True): key=self.mix_mac() if not encrypt: key+='\x00' p_sira = -1 encrypted = "" for str_sira in range(len(key)): p_sira += 1 if (p_sira >= len(password)): p_sira = 0 p = str(password[p_sira]) s = str(key[str_sira]) e = chr ( operator.xor(ord(s), ord(p))) encrypted += e if encrypt: encrypted += str(len(password)) return encrypted def decrypt(self,enc): enc_len=int(enc[len(enc)-1]) return enc[:enc_len] def mix_mac(self): mac=self.getMacAddress() KEY='pythontr' mixed_mac='' str_mac=str(mac) for i in range(len(KEY)): mixed_mac+=str_mac[i]+KEY[i] mixed_mac+=str_mac[len(KEY):] return mixed_mac def getMacAddress(self): if sys.platform == 'win32': for line in os.popen("ipconfig /all"): if line.lstrip().startswith('Physical Address'): mac = line.split(':')[1].strip().replace('-',':') break else: for line in os.popen("/sbin/ifconfig"): if line.find('Ether') > -1: mac = line.split()[4] break return mac
Eveet, şimdi gelelim açıklama kısmına. Önce programın tam olarak ne yaptığını anlatayım daha sonra açıklamalara geçeriz. Program kullanıcının mac adresini sizin verdiğiniz KEY ile (burada “pythontr”) bit kaydırma işlemine tabi tutup bir değişken üretiyor. Daha sonra sizin verdiğiniz değişken ile (şifrelenecek değişken) kendi ürettiği değişkeni xor işlemine sokup size şifrelenmiş veriyi döndürüyor.
Gelelim metodlara:
getMacAddress():
os ve sys modüllerini kullanarak kullanıcının mac adresini öğreniyoruz.
sys.platform ile kullanıcının işletim sistemini öğreniyoruz, burada winfos ve linux için düzenlenmiştir.
os.popen ile komut istemine bir boru açıp mac adres bilgilerini veren komutu çalıştırıyoruz, devamında ise string işlemlerle çıktıdan mac adresini ayıklıyoruz.
mixMac():
Burada aldığımız mac adresi ile belirlediğimiz KEY değişkenini bit kaydırma işlemi ile karıştırıyoruz ve bu karıştırdığımız yeni string veriyi döndürüyoruz. Burada dikkat edilecek önemli nokta verdiğiniz KEY’in mac adresinden uzun olmaması gerektiği. Aksi halde “string index out of bound” hatası alırsınız.
decrypt():
Bu fonksiyon ise şifresini çözdüğümüz veriden ham şifreyi elde etmeye yarıyor. Programın kullanımında da göreceğiz, 8 karakterli bir şifre verdiğinizi varsayalım, çözdüğünüz şifre mac adresinin karakter sayısı+verdiğiniz KEY’in karakter sayısı kadar tekrarlı gelecek. Bu yüzden şifreleme yaparken şifreli verinin sonuna şifrenin karakter sayısını giriyoruz ve bu fonksiyonda o karakter sayısı kadar veriyi çekip tekrarları almamış oluyoruz. Korkmayın aşağıda örnekleyince daha kolay anlayacaksınız
xor():
Esas oğlan. Şifreleme işlemini yapan fonksiyon. Yaptığı iş çok karışık değil aslında. Programa gönderdiğiniz şifre ile programın oluşturduğu verinin her bir karakterinin ASCII kodunu alıp onları xor işlemine sokuyor. Burada “encrypt” parametresinden bahsetmekte fayda var. Şifreleme yapacağımız zaman “True” çözümleme yapacağımız zaman “False” değeri veriyoruz. Onu şu sebepten kullandık, şifreleme sırasında şifrelediğimiz verinin karakter sayısını verinin sonuna eklediğimizi söylemiştik. Çözümleme yaparken referansımız olan mac adresi ile xor işlemine soktuğumuzda verideki karakter sayısının işlenmediğini görürüz, çünkü mac adresinin karakter sayısı aynıdır ancak biz şifreli veriye sonradan bir karakter eklemişizdir, dolayısıyla mac adresinde o karakter ile xor işlemine girecek eleman kalmamıştır. Bu yüzden çözümleme yapacağımız zaman mac adresine şifremizin eleman sayısını da işleme sokmak için bir veri ekliyoruz. Peki nedir eklediğimiz veri “\x00” verisi, yani ascii 0′ın char karşılığı. Peki neden 0 ekledik, 0 ile herhangi bir sayıyı xor işlemine sokarsanız sonuç olarak sayının kendisini alırsınız. Anlayacağınız 0 xor işlemi için etkisiz eleman, dolayısıyla bize direk olarak şifremizin karakter sayısını döndürüyor. Olay bundan ibaret, 2 tane integer değerin xor sonucunu veriyor bize (her karakter için). Şifrelenmiş verimiz bu oluyor.
Şimdi gelelim programın örnek kullanımına. Python yorumlayıcısını açıyoruz (yanında kahve içmekte özgürsünüz) ve başlıyoruz.
In [1]: from Encrypt import Encrypt In [2]: e=Encrypt() In [3]: passwd='adige' In [4]: sifreli=e.xor(passwd) In [5]: sifreli Out[1]: 'Q\x14SUW[!-]]%T\x10]WS^,#_Y S\x13_SVS"![\\-W\r[V[] %^Q#&\x0e^[U_$ S_![\nSUW[!-]]%!\x1d]WS^,#_Y Z\x15_SVS"![\\-5' In [6]: sifresiz=e.xor(sifreli,False) In [7]: sifresiz Out[2]: 'adigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadigeadi5' In [8]: sifre=e.decrypt(sifresiz) In [9]: sifre Out[3]: 'adige'
Programın kullanımı bu şekilde. Kafanıza takılan bişey olursa sormaktan çekinmeyin.
Şimdilik benden bu kadar, bir sonraki Python macerasında görüşmek üzere.
Özgür kalın..
Eylül 21st, 2008 at 00:28
Yazarın elinden geleni yapmasına rağmen ruhsuz okuyucu yazıyı okumamış ve direk yorum bölümüne geçmiştir
Uzun zaman sonra RSS’de pythonturk.com’dan gelen yazıyı görmek güzel. Yolun açık olsun
Eylül 21st, 2008 at 00:33
Hain okuyucu :))
Yeni bir felsefe edindim kendimi Uğurcum, az ama öz yazıyorum bundan sonra [sorumsuzluğumu böyle örtmeye çalışıyorum sanki] :))
Daha güzel paylaşımlarda buluşmak üzere..
Eylül 23rd, 2008 at 11:43
Çok lezzetli bir şifreleme çok beğendim.Darısı yenilerinin başına.:)
Aralık 16th, 2009 at 01:49
Merhaba ben bu örneği denemedim ancak dikkatimi çeken ve kafamı karıştıran bir bölüm var. popen dan sonra ki String ayıklama kısmı. :)) Tam olarak ne yapıldığını açıklamanız mümkün mü! acaba?