Python - Hayal Ediyorum # Şifreleme Güvensizliği

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

1 Beğeni

@dildeolupbiten benim bir konumda bu tarz yer değiştirmek için bir fikir vermişti böyle tum karakterleri yapmak zor

1 Beğeni

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.

2 Beğeni

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.

2 Beğeni

Zamanında ben de böyle bir şeyler denemiştim verilen değerleri kendim verdiğimden dolayı kimsenin
çözemiyeceğini düşünüyordum. :))

Ayrıştırmasına gerek yok bile. Bu şekilde bir şifreleme mantığını kullandığınızı düşünelim çok büyük bir dosyayı şifreledikten sonra.

“Frekans Analizi” dediğimiz bir yöntem mevcut.

Şifrelenen dosya içerisinde en çok kullanılan ve en az kullanılan charları alıp bunları yüzdeye göre ayırıyor.

Bunun sonucunda farz edelim en fazla .yuyu kullanıldı türkçe de en çok kullanılan harf nedir farzedelim “a” o zaman her a yerine .yuyu deniyor.

Bunu bu şekilde yaptıktan sonra çözmesi çok basit :slight_smile:

2 Beğeni

@EkremDincel

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

Söylediklerinden anladıklarım bunları oldu.

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;

< a > yerine

< 63463h63jh463hv46hv34h6lkjh34v46hlş3hjc4l6h2kl443lkch46şc3h4şlk4hş3lk4j6cşlkj6cklşj46clk3464sgjhasdjgha3tha3uthwu3krhnwukhrhvuhvu5h2cu5h1pıu2yh3c12378yhc2873yuh58923h598vh23985hv2938j5hc82913uc5 >

veya daha uzun yine bu bahsettiğiniz

burada da işe yarar mı?

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.

1 Beğeni

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.

Ben bu fonksiyon içerisine 7 değerini vereceğim.

Çıktısına baktığımızda dene(7) >= 2 değerini döndürdü.

Şimdide bu fonksiyon içerisine 10 değerini verelim.

Çıktısına baktığımızda dene(10) >= 2 değerini döndürdü.

Daha 2 değerini döndürecek tonlarca değer var :slight_smile:

Bu fonksiyonun tersini nasıl yazabiliriz ?

Umarım anlaşılmıştır.

Kısaca baktığımızda MD5’te bu şekilde bir yapıya sahip.

Yukarıda zaten bu yapıdan bahsedilmiş.

1 Beğeni

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…

1 Beğeni

Hiçbir sistem hack’lenemez…

1 Beğeni

çö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.

Sadece vakit alıyor :frowning: ya da kısacık bir an sürüyor.

hacklenemez değildir diyecektin sanırım?

2 Beğeni

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

Her sey brute force ile cozuluyor.

"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

Simple substitution cipher.

Yukarida @Frequenter’in dedigi frekans analizi. Ilkel anlatimlari seviyoruz.

2 Beğeni

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?

şu kısım beni can damarımdan vurdu. Yeterli oldu :slight_smile:

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!

Hayır. Mesela “a” harfi için sadece “.yuyu” olmasın. Hem “.yuyu” hem de “.yoyo” olsun.(veya daha fazla seçenek) Bilgisayar da rasgele birini seçsin.

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

1 Beğeni