Şifreleme işte. Var olanı var olan gibi saklamak yerine karma karışık yapılar oluşturma. Elbette yaşadığımız güne kadar gelmiş bir çok teknoloji var bu konuda. Fakat ben o teknolojilerden daha iyi bir şey üretmek gibi bir niyetim olmadan bir şeyler yapabilecek miyim onu düşünerek ilkel yapıda bir şeyler geliştirdim.
Kod dosyaları fazla ve satırları çok olduğu için buraya atarak kalabalık bir görüntü oluşmaması için rar halinde buraya tıklayarak indirebilirsiniz.
Mantıken şöyle çalışıyor. Kullanıcı kayıt oluşturduğu zaman yazdığı şifrede karşılık gelen değerler yerine veri tabanına karma karışık bir değer ekliyor. örneğin şifresi > 951753 < ise bu değer veri tabanında > .ioio.rtrt.qqqq.yuyu.rtrt.wewe < şeklinde kayıt ediyor ve ardından kullanıcı giriş yapmak istediğinde 951753 şifresini girdikten sonra kod bu değeri yine dönüştürüp veritabanında sorgulayıp geri çekiyor ve ikisi aynı ise doğruluyor.
Çok ilkel… Ve tüm detayları kod bloklarında kabak gibi açık. Tıpkı aşağıda gösterdiğim gibi…
for p in first_list:
if p == "0":
p = ".oppo"
last_list.append(p)
elif p == "1":
p = ".qqqq"
last_list.append(p)
elif p == "2":
p = ".qwqw"
last_list.append(p)
elif p == "3":
p = ".wewe"
last_list.append(p)
elif p == "4":
p = ".erer"
last_list.append(p)
elif p == "5":
p = ".rtrt"
last_list.append(p)
elif p == "6":
p = ".tyty"
last_list.append(p)
elif p == "7":
p = ".yuyu"
last_list.append(p)
elif p == "8":
p = ".uiui"
last_list.append(p)
elif p == "9":
p = ".ioio"
last_list.append(p)
Paketlemeden sonra biri ayrıştırsa şifreleme mantığı çözse çok basit şekilde çöker yani yaptığım kod. Fakat dediğim gibi. HAYAL EDİYORUM. Şuan için amacım iyi bir sistem geliştirmek değil. Nereye kadar hayal edip, neler yapabileceğimi keşfetmek istiyorum. Tamam güzel ilkel yapıda bunu yazdım güvenli olmasa da istediğim işi yapabiliyor.
Birlikte hayal edelim isterim. Nasıl bir yorumlamada bulunursunuz? Fikirleriniz nelerdir? Böyle bir mantık üzerinden neleri, nerelere kadar geliştirebiliriz? Şifreleme sistemleri hakkında daha farklı bilgiye sahip olanlar neler söyleyebilirsiniz?
Bir şeyin güvenliğini sağlamanın çok hoşuma gittiğini fark ettim. Fikir alışverişinde bulunarak farklı hayal güçlerini, bilgi birikimlerini ve fikirlerini görmek ilham kaynağı olabilir.
Dediğiniz gibi asıl problem uygulama üzerinde tersine mühendislik yaparak şifreleme algoritmasının elde edilebileceği. Bu yüzden şifreleme algoritması başkaları tarafından bilinse bile sakladığımız veriyinin bulunamayacağı bir algoritma oluşturmamız lazım. Bunun en kolay yolu tek yönlü fonksiyonlar kullanmak, yani f(a) işleminin sonucu b ise, b'yi ve f fonksiyonunu kullanarak a'nın bulunamayacağı bir f fonksiyonu. Tek yönlü fonksiyonlara çok basit bir örnek vereceğim:
f(x) = x % 123
Farz edelim ki bu fonksiyona 124 parametresini verdik ve 1 elde ettik, sadece f fonksiyonunu ve 1 çıktısını kullanarak başta fonksiyona verilen parametrenin 124 olduğunu bilemeyiz. 247 de olabilir, 370 de…
Eğer kaydedeceğimiz şey girilen şifre (x) değil de, f(x) olursa daha sonra girilen şifreleri de f fonksiyonundan geçirip kayıt ile aynı olup olmadığı kontrol edilebilir.
>>> f = lambda x: x % 123
>>> def giriş_yap(x):
if f(x) == kaydedilen_şifre:
print("Giriş yapıldı")
else:
print("Şifre yanlış")
>>> def kayıt_yap(x):
global kaydedilen_şifre
kaydedilen_şifre = f(x)
>>> kayıt_yap(247)
>>> giriş_yap(246)
Şifre yanlış
>>> giriş_yap(12)
Şifre yanlış
Ama burada başka bir problem var, kaydettiğimiz sonucu sadece 247 vermiyor:
>>> giriş_yap(124)
Giriş yapıldı
Bunun sebebi hem 124'dün hem de 247'nin f fonksiyonunundan geçince aynı sonucu vermesi. Yani iki ayrı şifre aynı sonucu veriyor. Bunu engellemenin kolay yollarından biri çıktıda verilen verinin boyutunu arttırmak, bu çıktı başına düşen şifre miktarınının azalmasının önünü açacaktır. Ayrıca fonksiyon da bu potansiyeli kullanacak hale getirilmeli, çıktı başına düşen olası şifre sayısı bütün çıktılar için yakın olmalıdır.
Kriptografide bunun gibi tek yönlü fonksiyonlara hash fonksiyonları deniliyor.
Ben şifreleme konusunda ilham vermesi için aşağıdaki ders notunu paylaşmak istiyorum. Böylece çeşitli şifreleme yöntemleri hakkında fikir edinebilirsiniz. Sayfa 66, kırılması simetrik algoritmalara göre daha zor ve güvenli olan Asimetrik Şifrelemeyi anlatmaktadır.
Şifreleme algoritmasını yazarken, birbirini takip etmeyen ama sonuçları birbirleri ile bağlantılı olan ve sonuç çıktıları daima farklı olan, işlem sırası takip edilememesi açısından yapılar arasındaki geçişlerin karmaşık olmasının faydalı olacağını mı söylüyorsun?
bu da bambaşka bir şeymiş. O zaman var programın tanımladığı değerler ile şifreyi saklamak çok da makul bir şey değil. ya da şöyle mesela harfin karşılık gelen değeri çooook uzun bir yapı oluştursa örneğin;
Siz girilen şifreyi doğrulamak istiyordunuz, ben de onun için bir algoritma örneği verdim. Eğer şifrenin kendisine saklanan bilgiyi kullanarak erişmek istiyorsanız büyük ihtimalle o bilgiye erişecek tek kişi siz olmazsınız zaten.
Karmaşığı hangi anlamda kullanıyorsunuz ki? Ben fonksiyonun tek yönlü olması ve iki farklı parametre için aynı sonucu vermemesi gerektiği üzerinde durdum.
Tabii yine yarıyacaktır. Mesela size MD5 ’ ten biraz bahsedeyim neden brute-force ile çözüldüğünü anlıyacaksınız.
Bilgisayar kavramlarına indiğimizde ‘Trapdoor Function’ dediğimiz bir fonksiyon tipi var. Türkçe de karşılık gelen “Geri Dönüşü Olmayan Fonksiyon” olarak kullanılıyor.(Anlamı tam olarak bu değil) şimdi düşününce nasıl diyorsunuz.
Örnek verelim.
def dene(a):
a * 2 % 3;
Gibi bir fonksiyon olsun elimizde. Bunu şifreleme fonksiyonu olarak düşünelim.
Aynen ben de yapmıştım öyle bir şey. İlk gerçek (!) tkinter programımdı. Hatta şifrelere özel keyler falan da yapacaktım, taa ki @aib bunların çözülebildiğini söyleyene kadar…
çözülemeyecek bir şifre yoktur diye düşünüyorum zaten. Hatta Bill Gates abimiz bir ara demişti wander algoritmasını kırana 10 milyon dolar vereceğim. 3-4 tane hecathlon hacker gurubu 1 sene uğraşıtı kıramadı. sonra Bir lise bilgisayar öğretmeni derste tahtaya algoritmayı yazmış. Lise 3 öğrencisi 1 dk da problem çözer gibi çözmüş. Ailesi aldı parayı çocuk hala microsoftta çalışıyor. çocuk kim mi ? adı mı ? türk bir ailenin evladı adı da Mert muhammed. Vefa lisesinden bir çocuktu. helal olsun.
Bu tür şifreleme mantığının bir adı vardı ve çözümü oldukça basit ve eski. Örneğin Türkçe de en çok ‘a’ ve ‘e’ kullanılır. Şifreli yapıs arasında en çok tekrar eden iki şifreli içerik tespit edilir. Bu iki yapıdan biri ‘e’ ya da ‘a’ dır. Aşırı ilkel şekilde anlattım hocam ama mantık bu. Hatta eski yazılı tabletlerin ve kadim dillerin bir çoğu bu yöntem ile çözüldü.
"Geri donusu olmayan fonksiyon"u one-way function’i tanimlamak icin kullanirdim. MD5 trapdoor’dan ziyade normal bir one-way function.
Bu fonksiyonun tersi tanim geregi yok. Fakat bunu bir hash fonksiyonu olarak kullanisli kilacak ozellik fonksiyonun tersinin olmamasi degil (hic bir hash fonksiyonunun yok), verilen bir ciktinin girdisini bulmanin zor olmasi (preimage attack). Yani 2’nin “tersi” olarak 7 veya 10 bulup emin olamamak onemli degil, onemli olan bunlardan herhangi birini bulabilmek.
Yoksa f(x)=0 fonksiyonunu kullanirdik, onun tersini yazmak “daha da” zor.
“Sifre” ve "cozulme"nin tanimlarina gore degisiyor:
Algoritmayi “kirmak” 10.5 milyon dolarlik bilgisayar ve elektrik gerektiriyorsa “kirilamaz” diyebilir miyiz o zaman? Veya
Buraya yazmak ne kadar doğru bilmiyorum ama şifreleme üzerine bir doğa harikası var önümüzde. Adı DNA.
DNA genlerden, genler ise kodlardan oluşuyor. Her bir kod üç nükleotitten oluşuyor ve her nükleotit için 4 tane seçenek var. Bilirsiniz adenin, guanin, sitozin, timin. Yani 3^4=64 tane kod oluşturabiliyoruz. Bunlardan 3 tanesi özel bir iş için kullanılıyor. Kalan 61 tanesi 20 tane aminoasidi şifrelemek için kullanılıyor. Sayılardaki bu orantısızlıktan dolayı 1 aminoasidi birden çok kod şifreleyebiliyor.
Elbette bu sistemde bilim adamları tarafından kırılmış ancak bir şifreleme sistemi olarak kullanılsa en azından frekans analizini yenebileceğini düşünüyorum.
Yani mantık 1 veri için birden fazla şifre.
şifreyi al > yeniden şifrele
yeniden şifrelenmiş şifreyi al > yeniden şifrele
yeniden şifrelenmiş şifrenin yeniden şifrelenmiş halini al > yeniden şifrele
ilk şifreyi her şifrelendikten sonra tekrar şifrele mi demek istiyorsun?
Ekleyeyim. Bu güçlü şifrelerde seneler sürüyor ve o zaman verinin bir anlamı kalmıyor. Ama çağımızda kuantum bilgisayarlar ile bu işlem çok daha kısa sürebilecek. Artık kriptografi için yepyeni bir çağ başlıyor!
Onu yaptım. bütün rakam değerleri için bir liste oluşturdum. her liste de rakama karşılık gelen 12 farklı değer var. Şireyi kayıt ederken her bir değer için rastgele seçip kayıt ediyor. 6 haneli şifrede 10 farklı rakam (0,1,2,…9) ve 10 farklı rakam için 12 farklı seçenekten toplam 120 seçenek sonra bunun kombinasyonu baya bi gidiyor. Ama o da güvensiz. Sadece takip edilebilir oluşunu zorlaştırıyor.
Şifreyi gizlemenin saklamanın değil de ona ulaşma yolundaki vakti uzatmanın yolunu buluyorum sürekli. Zaten gelen cevaplar ve araştırmalar da şifreyi görünmez kılmak, ona ulaşmayı imkansız hale getirmenin şimdilik mümkün olmadığı aşikar