سلام من پست رمزگذاری با پایتون رو خوندم ولی میشه بگید چطور به برنامه بگیم تمام فایل های درون یه فولدر رو رمز گذاری کنه؟
توی این پست قراره نحوه ی کریپت کردن اطلاعات یک فولدر خاص
که مسیرشم قراره کاربر وارد کنه رو با پایتون بررسی کنیم ....
بنظرم اگه به برنامه بگیم همه ی فایلارو کریپت کنه
اونموقع ممکنه بعضی فایلها داخل یه فولدر باشه که باعث کندی یا حتی بسته شدن برنامه بشه
چون دیدم فایلایی که حتی تا 11 گیگ یا بالاتر بودن ( مثل فایل های بک آپ و غیره... )
برای اینکار هم باید سه تا تابع بنویسیم تا کارمون رو ساده کنه
اولی بیاد فایلای مد نظرمون رو لیست کنه
دومی بیاد فایلارو کریپت کنه
سومی هم بیاد و پسوردمون رو اینکد کنه
حالا بریم سراغ کد نویسی
اول باید کتابخونه های مورد نیاز رو ایمپورت کنیم
from Crypto.Cipher import AES from Crypto.Hash import SHA256 from Crypto import Random import os
حالا باید تابع اول رو برای لیست کردن فایل های مشخص بنویسیم
def discoverFiles(startpath): extensions = [ 'mp3' ] for dirpath, dirs, files in os.walk(startpath): for i in files: absolute_path = os.path.abspath(os.path.join(dirpath, i)) ext = absolute_path.split('.')[-1] if ext in extensions: yield absolute_path
کد بالا به ما کمک میکنه تا فایلای با پسوند mp3 رو داخل یه فولدر لیست کنیم که البته میتونیم پسوند های دیگه رو هم بهش اضافه کنیم
حالا نوبت به این میرسه که یه تابع بنویسیم تا فایلهارو کریپت کنه
def encrypt(key, filename): chunksize = 64 * 1024 outputFile = i + '.enc' filesize = str(os.path.getsize(filename)).zfill(16) IV = Random.new().read(16) encryptor = AES.new(key, AES.MODE_CBC, IV) with open(filename, 'rb') as infile: with open(outputFile, 'wb') as outfile: outfile.write(filesize.encode('utf-8')) outfile.write(IV) while True: chunk = infile.read(chunksize) if len(chunk) == 0: break elif len(chunk) % 16 != 0: chunk += b' ' * (16 - (len(chunk) % 16)) outfile.write(encryptor.encrypt(chunk))
کد بالا هم دو تا ورودی اسم فایل و پسوورد رو میگیره و با پسوند مشخص شده ای ( enc ) اون فایل رو کریپت میکنه
برای تابع آخر هم باید کاری کنیم که تابع بیاد پسوورد رو بگیره و اون رو اینکد کنه
def getKey(password): hasher = SHA256.new(password.encode('utf-8')) return hasher.digest()
حالا باید دو تا ورودی بگیریم که اولی برای فولدریه که این دوستمون میخواست :)
و دومی هم برای پسوورد فایل ها
path = raw_input("Enter your path : ") ; path = str(path) password = raw_input("Enter your key : ") ; password = str(password)
حالا نوبت به این میرسه که از تابع discoverFiles استفاده کنیم
و فایل هایی با پسوند های مشخص رو بریزیم داخل یه متغیر
x = discoverFiles(path)
در آخر هم باید دستور بدیم که با استفاده از یه حلقه
اسم فایل هارو استخراج کنه و از تابع getKey و encrypt استفاده کنه برای کریپت کردن اون فایلا
for i in x: encrypt(getKey(password),i) os.remove(i)
حالا فقط کافیه همه ی کدهای بالارو بچینیم در کنار هم تا چیزی میخوایم درست بشه
من فقط خواستم یه خرده با توضیحات باشه بخاطر همین اینجوری نوشتم
به هر حال اینا هم کدای کلی چیزی هست که تا الان نوشتیم :)
from Crypto.Cipher import AES from Crypto.Hash import SHA256 from Crypto import Random import os def discoverFiles(startpath): extensions = [ 'mp3' ] for dirpath, dirs, files in os.walk(startpath): for i in files: absolute_path = os.path.abspath(os.path.join(dirpath, i)) ext = absolute_path.split('.')[-1] if ext in extensions: yield absolute_path def encrypt(key, filename): chunksize = 64 * 1024 outputFile = i + '.enc' filesize = str(os.path.getsize(filename)).zfill(16) IV = Random.new().read(16) encryptor = AES.new(key, AES.MODE_CBC, IV) with open(filename, 'rb') as infile: with open(outputFile, 'wb') as outfile: outfile.write(filesize.encode('utf-8')) outfile.write(IV) while True: chunk = infile.read(chunksize) if len(chunk) == 0: break elif len(chunk) % 16 != 0: chunk += b' ' * (16 - (len(chunk) % 16)) outfile.write(encryptor.encrypt(chunk)) def getKey(password): hasher = SHA256.new(password.encode('utf-8')) return hasher.digest() path = raw_input("Enter your path : ") ; path = str(path) password = raw_input("Enter your key : ") ; password = str(password) x = discoverFiles(path) for i in x: encrypt(getKey(password),i) os.remove(i)
موفق باشید