Python dosya oluşturma

1 Beğeni

Bilinen bir teknik kullanirsaniz baskasi ugrasip o sifreyi cozebilir.

Bulunacağını pek sanmıyorum. Dosyanın kopyalanmasını engelleme de yapıcam. :slight_smile:

Dosyayi sifreledin. Sifreleme anahtarini nerede tutacaksin? Her nerede tutuyorsan, txt’ye koyulan parolayi oraya koy?

Evet. Bilinmeyen bir teknik kullanilirsa da, baskasi ugrasmadan o sifreyi cozebilir.

1 Beğeni

Bu modül ile şifrelemeye çalışcam.

https://www.tutorialspoint.com/python/os_chmod.htm

Niye ki? Kendi tekniğimizi üretirsek başkası nasıl uğraşmadan çözecek?

Şifreleme algoritması kendinizin diye kırılmayacak bir kanun yok herhalde illahaki kırılacaktır sonuç olarak tüm şifreleme türleri ilk çıktığında ilk çıkaran insanlarındı ve sizin yaptığınız şifreleme algoritmaları ne kadar sağlam olabilir ? o tarz algoritmalar için ne kadar zaman ugraşılıyor iki üç saniyelik bir iş değil.

bu modül ile şifrelemeye çalışacağım derken attığınız modül os modülünün chmod özelliğini göstermiş ve aldığı parametreler ise okuma kipi yazma kipi v.s bu bir şifreleme değildir izin olayları bunlar.

Yanlış yazmışım. :slight_smile: o modül oluşturduğum dosyanın kimlerin kullanabileceği için bir özellik.

İki üç saniyeden kısa sürer.

chars = "A B C Ç D E F G Ğ H I İ J K L M N O Ö P R S Ş T U Ü V Y Z".split(" ")

import random
random.shuffle(chars)

numbers = list(range(1, 30))
random.shuffle(numbers)

algorithm = dict(zip(chars, numbers))

Üretilebilecek en basit algoritma. İçine + , * - gibilerini de atıp güçlendirilebilir. Şifreleme içinse; (bir şifreleme algoritmasının a.json içinde olduğunu varsayalım.)

import json
a = json.load("a.json")

def parse(data, algorithm):
    assert isinstance(data, str)
    assert isinstance(algorithm, dict)
    d = ""
    for i in data:
        d += str(algorithm.get(i, " ")) + "."
    return d.strip(".")

password = "FKDKENUEF"
print(parse(password, a))

Kod çalıştığı zaman sadece nokta çıktısı veriyor. Şurayı değiştirmek lazım

algorithm = dict(zip(numbers, chars))

yerine

algorithm = dict(zip(chars, numbers))

Birisi dönüştürme için gerekli json dosyasını ele geçirse tüm şifreleri çözebilir. Anahtarlamalı olmayan şifrelemelerde bir verinin çıktısının ne olduğunu brute force ile bulmak,tahmin etmek mümkün. Şifrelemeyi bit düzeyinde yapmak daha güvenlidir.

Bir de AES şifreleme algoritmasının nasıl çalıştığına bakın isterseniz

http://bilgisayarkavramlari.sadievrenseker.com/2009/06/03/aes-ve-rijndeal-sifreleme/

1 Beğeni

bende sana onu diyorum zaten senin yaptığın şu algoritmayı bir insan çözemiyecek mi zannediyorsun yani şuanda yapmış olduğun bu algoritmayı sağlam olarak mı görüyorsun md5 v.s gibi şeyler neden kırılamıyor sence 3 saniye veya 2 saniye demi oluyor bunlar ?
ayrı ayrı satırlarda assert yazmanıza gerek yok and ile birleştirip tek assert ile yapabilirsiniz.

assert isinstance(data,str) and isinstance(algorithm,dict)

herhangi birisi false döndürdüğü zaman yine AssertionError yükselticektir ikisininde doğru olduğu durumda devam edicektir.

Haklısınız. Bunlar Brute Force ile çözülebilir. Bit düzeyinde yapmak derken tam olarak neyi kast ediyorsunuz?

1 Beğeni

Bit düzeyinde işlem yapmaktan kastım, elinizdeki bilgiyi önce binary hale getirmek ve sonra da bunu çeşitli bit operatörleri ile(and,or,exor,shift vs) değiştirmektir.

https://wiki.python.org/moin/BitwiseOperators

1 Beğeni

Monoalphabetic substitution cipher. Bilinen en eski sifreleme yontemi olabilir. Ilkokulda QBASIC’le yazmistim, keyspace 256! buyuklugunde oldugu icin kirmanin imkansiz oldugunu dusunuyordum. Sonra frekans analizini ogrendim…

MD5 sifreleme algoritmasi degil.

Lutfen yapmayin. Birbirleriyle alakasiz assert’leri ayri satirlarda gormek istiyoruz.

Yukaridaki ASCII data da binary. Hatta bilgisayara alabildigin butun data tanim geregi binary.

Burada sanirim demek istedigin “diffusion kullan”. Veya “substitution cipher/ECB kullanma”.

1 Beğeni

Aslında haklısınız binary tabiri yanlış olmuş. Kısaca demek istediğim eldeki veriyi bitleriyle oynayarak(kaydırma,xor’lama vs) şifrelemeye çalış. Buna diffusion mu deniyor acaba?

1 Beğeni

Sifrelemek degistirmek oluyor, degistirmek de tanim geregi bitlerini degistirmek zaten. Bir seyi bitleriyle oynamadan sifrelemek veya baska herhangi bir sekilde degistirmek imkansiz.

“Karistir ki plaintext’teki en ufak degisiklik butun ciphertext’i degistirsin” dersen diffusion, “Karistir ki key’deki en ufak degisiklik butun ciphertext’i degistirsin” dersen confusion. Bitlerle bu sekilde oynamak icin S-box’lar, P-box’lar kullaniliyor.

2 Beğeni

Kullanıcı parolaları için çoğunlukla salt-hash algoritmaları tercih ediliyor diye biliyorum. Google eposta şifrelerini bu şekilde saklıyor mesela. Bu sistemde şifrenin kendisi saklanmıyor. Her yeni şifre oluşturulduğunda rastgele bir salt (tuz) oluşturuluyor. Daha sonra bu salt kullanılarak şifremiz hashleniyor. Biz de bu hashı kayıt ediyoruz. Daha sonra kullanıcı tekrar şifre girişi yaptığında bu şifrenin daha önce kaydettiğimiz hash ile uyuşup uyuşmadığını kontrol ediyoruz. Dikkat ederseniz burada şifreyi hiçbir yere kaydetmedik. Bu yüzden isteyen istediği dosyayı okusun veya ele geçirsin, şifremizi (doğrudan) elde edemiyor. Bu işlem için örnek bir kod veriyorum:

import hashlib, binascii, os

def hash_password(password):
    """Hash a password for storing."""
    salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii')
    pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'), 
                                salt, 100000)
    pwdhash = binascii.hexlify(pwdhash)
    return (salt + pwdhash).decode('ascii')

def verify_password(stored_password, provided_password):
    """Verify a stored password against one provided by user"""
    salt = stored_password[:64]
    stored_password = stored_password[64:]
    pwdhash = hashlib.pbkdf2_hmac('sha512', 
                                  provided_password.encode('utf-8'), 
                                  salt.encode('ascii'), 
                                  100000)
    pwdhash = binascii.hexlify(pwdhash).decode('ascii')
    return pwdhash == stored_password
>>> hash = hash_password("şifrem")
>>> verify_password(hash, "yanlış")
False
>>> verify_password(hash, "şifrem")
True

Şimdi güvenlik kısmına gelince, bu yöntem ile şifrelediğimiz şifreler de her yöntemde olduğu gibi deneme yanılma yoluyla (brute force) ile bulunabilir. Zaten bu yüzden hep etraftan şifrelerimizin en az 8 harf olması gerektiğini, noktalama işaretleri vs olması gerektiğini duyuyoruz. Mümkün şifrelerin sayısı arttıkça zorla bulma işlemi uzuyor çünkü. Ama mesela kişisel bilgisayarımız gibi ortalama işlem gücüne sahip bir bilgisayarda bu şifrelerin brute force ile kırılması 10.000 yıldan fazla sürüyor. Kriptoloji tamamen buna dayanarak çalışır zaten.

3 Beğeni

“Kullanici sifresi kaydedip giriste kontrol etme” dersek dogru. “Sifreleme” (encryption) dersek yanlis, o bambaska bir sey ve hash ile yapilamiyor.

Hm altindaki kod ornegi anlatilandan biraz farkli (daha modern ve guvenli). Ben olsam aciklamayla uyussun ve anlamasi kolay olsun diye su ornegi verirdim:

def hash_password(password):
    salt = random_string() #okunur olabilir
    hash = sha256(salt + password)
    return (salt, hash)

def verify_password(stored_salt, stored_hash, provided_password):
    return sha256(stored_salt + provided_password) == stored_hash

Sonucta ikisi de production-ready kod degil.

2 Beğeni

Evet, asıl amacım kodu açıklamak olsaydı sizin örneğiniz daha yerinde olurdu. Çok daha anlaşılır.

Haklısınız, terimleri yanlış kullanmışım. Şifreleme farklı bir şey tabii, biz bu yöntemde parolanın kendisini elde edemiyoruz.

1 Beğeni