FA-TOOLS — Header Component

برنامه رمزنگاری متن با پایتون — کد آماده

سلام رفیق برنامه‌نویس! اگه دغدغه امنیت اطلاعاتت رو داری و می‌خوای مطمئن بشی که پیام‌هات دست غریبه‌ها نمی‌افته، این مقاله دقیقاً برای توئه. قراره با هم یه سفر هیجان‌انگیز به دنیای رمزنگاری متن با پایتون داشته باشیم. اینجا نه فقط تئوری، بلکه کلی کد آماده و عملی منتظرته تا بدون دردسر اطلاعاتت رو رمزنگاری و رمزگشایی کنی. آماده‌ای؟ بزن بریم! برای اینکه از بقیه کدهای آماده و اسنیپت‌های خفن پایتون هم غافل نمونی، حتماً یه سری به صفحه مربوطه‌اش بزن.

نقشه راه ما: رمزنگاری متن در یک نگاه!

برنامه رمزنگاری متن با پایتون — کد آماده — تصویر 1

🔑 تولید کلید

اولین گام، ساخت یک کلید سری برای رمزنگاری و رمزگشایی.

🔒 رمزنگاری متن

متن ساده رو با کلیدت قفل و غیرقابل خواندن می‌کنی.

🔓 رمزگشایی متن

متن قفل‌شده رو با همون کلید باز و دوباره قابل خواندن می‌کنی.

⚠️ مدیریت کلید

حفظ امنیت کلید از خود رمزنگاری مهم‌تره! روش‌های درست رو یاد می‌گیریم.

📞 برای مشاوره و راهنمایی بیشتر، با ما تماس بگیرید: 09202232789

چرا باید متن‌هامون رو رمزنگاری کنیم؟ دغدغه‌های امنیتی یه برنامه‌نویس!

برنامه رمزنگاری متن با پایتون — کد آماده — تصویر 2

تصور کن داری یه پیام مهم برای دوستت می‌فرستی، یا اطلاعات مشتری‌هات رو توی دیتابیس ذخیره می‌کنی. اگه این اطلاعات همین‌جوری خام بمونن، مثل یه کتاب باز می‌مونن جلوی چشم همه! هر کسی که به سیستم دسترسی پیدا کنه، می‌تونه همه چیز رو بخونه و سوءاستفاده کنه. رمزنگاری اینجاست که به کمکمون میاد.

رمزنگاری مثل یه قفل نامرئی عمل می‌کنه که اطلاعاتت رو به یه سری حروف و عدد درهم برهم تبدیل می‌کنه. فقط کسی که کلید اصلی رو داره، می‌تونه این قفل رو باز کنه و اطلاعات رو بخونه. این مسئله دیگه تو دنیای امروز یه آپشن نیست، یه ضرورت حیاتیه! مخصوصاً اگه با اطلاعات حساس سروکار داری، یا حتی اگه صرفاً می‌خوای حریم خصوصی خودت و کاربرانت رو حفظ کنی.

  • حفاظت از اطلاعات شخصی در برابر دسترسی‌های غیرمجاز.
  • امنیت تبادل داده در شبکه‌های عمومی (مثلاً ارسال ایمیل یا چت).
  • حفظ یکپارچگی داده‌ها (اینکه مطمئن باشیم اطلاعات در طول مسیر دستکاری نشدن).
  • پایبندی به استانداردهای امنیتی و قوانین حفظ حریم خصوصی (مثل GDPR).

پایتون، رفیق شفیق رمزنگاری! معرفی ابزارها

برنامه رمزنگاری متن با پایتون — کد آماده — تصویر 3

اگه با پایتون کار می‌کنی، خیلی خوش‌شانسی! پایتون با جامعه کاربری بزرگ و کتابخانه‌های قدرتمندش، یکی از بهترین گزینه‌ها برای پیاده‌سازی الگوریتم‌های رمزنگاریه. نیاز نیست از صفر یه الگوریتم پیچیده رو بنویسی. کتابخانه‌هایی هستن که کار رو برات حسابی راحت کردن.

یکی از بهترین و مطمئن‌ترین کتابخانه‌ها برای این کار، `cryptography` هست. این کتابخانه ابزارهای قوی و استانداردی برای رمزنگاری فراهم می‌کنه که حتی تو پروژه‌های جدی و سازمانی هم میشه روش حساب کرد. ما برای سادگی و کارایی بالا، از بخش `Fernet` این کتابخانه استفاده می‌کنیم که یه روش رمزنگاری متقارن و خیلی امن رو برامون فراهم می‌کنه.

گام به گام تا رمزنگاری: از تولید کلید تا کد نهایی

قدم اول: نصب کتابخانه `cryptography`

اول از همه، باید این کتابخونه رو نصب کنی. مثل همیشه، با `pip` می‌تونی این کار رو انجام بدی. ترمینالت رو باز کن و این دستور رو بزن:

pip install cryptography

اگه همه چیز اوکی باشه، کتابخونه نصب میشه و آماده استفاده‌ست.

قدم دوم: تولید و مدیریت کلید رمزنگاری (Key Generation)

کلید رمزنگاری، قلب سیستم امنیتی ماست. بدون اون، هیچکس نمی‌تونه پیامت رو بخونه یا تغییر بده. اگه این کلید گم بشه، اطلاعاتت برای همیشه از دست می‌ره. اگه هم دست افراد اشتباه بیفته، دیگه امنیتی در کار نیست. پس حواست به این مرحله باشه!

برای تولید یه کلید امن و اتفاقی، از `Fernet.generate_key()` استفاده می‌کنیم. بعدش، بهتره کلید رو توی یه فایل جدا ذخیره کنی تا بتونی موقع رمزنگاری و رمزگشایی ازش استفاده کنی.

from cryptography.fernet import Fernet

def generate_key():
    """
    کلید رمزنگاری جدیدی تولید می‌کند و آن را در فایل key.key ذخیره می‌کند.
    """
    key = Fernet.generate_key()
    with open("key.key", "wb") as key_file:
        key_file.write(key)
    print("کلید جدید تولید و در key.key ذخیره شد.")

def load_key():
    """
    کلید ذخیره شده در فایل key.key را بارگذاری می‌کند.
    """
    return open("key.key", "rb").read()

# اگه کلید نداریم، یکی بسازیم
try:
    key = load_key()
    print("کلید موجود بارگذاری شد.")
except FileNotFoundError:
    generate_key()
    key = load_key()

f = Fernet(key)
یه نکته مهم: فایل key.key رو به شدت امن نگه دار. این فایل نباید دست هیچکس بیفته. می‌تونی اون رو توی فولدرهای حساس سیستم عامل یا متغیرهای محیطی ذخیره کنی. حتی تو محیط‌های توسعه (مثل گیت) هم نباید باشه.

قدم سوم: تابع رمزنگاری متن (Encryption Function)

حالا که کلید رو داریم، می‌تونیم متن‌هامون رو رمزنگاری کنیم. یادت باشه که `Fernet` فقط با بایت‌ها (bytes) کار می‌کنه، نه رشته‌ها (strings). پس قبل از رمزنگاری، باید متنت رو به بایت تبدیل کنی (معمولاً با `encode(‘utf-8’)`).

def encrypt_message(message: str) -> bytes:
    """
    یک رشته متن را با استفاده از کلید بارگذاری شده رمزنگاری می‌کند.
    """
    encoded_message = message.encode() # تبدیل رشته به بایت
    encrypted_message = f.encrypt(encoded_message)
    return encrypted_message

# مثال استفاده:
plain_text = "سلام رفیق، این یه پیام محرمانه است!"
encrypted_data = encrypt_message(plain_text)
print(f"متن اصلی: {plain_text}")
print(f"متن رمزنگاری شده: {encrypted_data}")

قدم چهارم: تابع رمزگشایی متن (Decryption Function)

رمزگشایی دقیقاً برعکس رمزنگاریه. با استفاده از همون کلیدی که برای رمزنگاری استفاده کردی، می‌تونی بایت‌های رمزنگاری شده رو به حالت اول برگردونی. بعدش، باید بایت‌ها رو دوباره به رشته تبدیل کنی (`decode(‘utf-8’)`) تا قابل خوندن بشن.

def decrypt_message(encrypted_message: bytes) -> str:
    """
    یک بایت رمزنگاری شده را با استفاده از کلید بارگذاری شده رمزگشایی می‌کند.
    """
    decrypted_message = f.decrypt(encrypted_message).decode() # تبدیل بایت به رشته
    return decrypted_message

# مثال استفاده:
decrypted_data = decrypt_message(encrypted_data)
print(f"متن رمزگشایی شده: {decrypted_data}")
توجه: اگر کلید اشتباه باشه یا متن رمزنگاری شده خراب شده باشه، تابع decrypt یک استثنا (InvalidToken) ایجاد می‌کنه. همیشه این رو در نظر داشته باش و هندلش کن.

کد آماده و جامع: یک اسکریپت کامل برای شما!

خب، حالا که مراحل رو دونه دونه دیدیم، بیا یه اسکریپت کامل داشته باشیم که همه این کارها رو با هم انجام بده. این اسکریپت یه فایل کلید رو برات می‌سازه (اگه نداشته باشی) و بعدش می‌تونی باهاش متن‌هات رو رمزنگاری و رمزگشایی کنی. این همون کد آماده پایتون که دنبالش بودی!

from cryptography.fernet import Fernet
import os

KEY_FILE_NAME = "secret.key"

def generate_and_save_key():
    """
    کلید رمزنگاری جدیدی تولید می‌کند و آن را در فایل مشخص شده ذخیره می‌کند.
    """
    key = Fernet.generate_key()
    with open(KEY_FILE_NAME, "wb") as key_file:
        key_file.write(key)
    print(f"کلید جدید تولید و در {KEY_FILE_NAME} ذخیره شد.")
    return key

def load_key():
    """
    کلید ذخیره شده در فایل مشخص شده را بارگذاری می‌کند.
    """
    try:
        with open(KEY_FILE_NAME, "rb") as key_file:
            return key_file.read()
    except FileNotFoundError:
        print("فایل کلید یافت نشد. در حال تولید کلید جدید...")
        return generate_and_save_key()

def encrypt_text(text_to_encrypt: str, fernet_obj: Fernet) -> bytes:
    """
    یک رشته متن را رمزنگاری می‌کند.
    """
    return fernet_obj.encrypt(text_to_encrypt.encode('utf-8'))

def decrypt_text(encrypted_text: bytes, fernet_obj: Fernet) -> str:
    """
    یک بایت رمزنگاری شده را رمزگشایی می‌کند.
    """
    try:
        return fernet_obj.decrypt(encrypted_text).decode('utf-8')
    except InvalidToken:
        print("خطا: کلید نامعتبر است یا متن رمزنگاری شده خراب شده است.")
        return "" # یا یک مقدار مناسب دیگر برگردانید

if __name__ == "__main__":
    key = load_key()
    f_instance = Fernet(key)

    original_message = "این یک متن بسیار محرمانه است و باید محافظت شود!"
    print(f"متن اصلی: {original_message}")

    print("n--- در حال رمزنگاری ---")
    encrypted_msg = encrypt_text(original_message, f_instance)
    print(f"متن رمزنگاری شده: {encrypted_msg}")
    print(f"سایز متن رمزنگاری شده: {len(encrypted_msg)} بایت")

    print("n--- در حال رمزگشایی ---")
    decrypted_msg = decrypt_text(encrypted_msg, f_instance)
    print(f"متن رمزگشایی شده: {decrypted_msg}")

    print("n--- تست با متن متفاوت ---")
    another_message = "رمزنگاری موفقیت‌آمیز بود!"
    another_encrypted = encrypt_text(another_message, f_instance)
    another_decrypted = decrypt_text(another_encrypted, f_instance)
    print(f"متن دوم اصلی: {another_message}")
    print(f"متن دوم رمزگشایی شده: {another_decrypted}")

با این اسکریپت ساده، می‌تونی به راحتی فرآیند رمزنگاری و رمزگشایی رو برای متن‌هات مدیریت کنی. فقط کافیه فایل رو ذخیره و اجرا کنی. یادت باشه، کلید رو تو یه جای امن نگهداری!

رمزنگاری متقارن و نامتقارن: کدومش به کارت میاد؟

تو دنیای رمزنگاری، دو تا روش اصلی برای قفل کردن و باز کردن اطلاعات وجود داره: متقارن (Symmetric) و نامتقارن (Asymmetric). دونستن تفاوت این دوتا، بهت کمک می‌کنه تا بهترین انتخاب رو برای پروژه‌ات داشته باشی. `Fernet` که ما استفاده کردیم، یه نوع رمزنگاری متقارنه.

مقایسه رمزنگاری متقارن و نامتقارن
ویژگی رمزنگاری متقارن (Symmetric)
تعریف از یک کلید برای رمزنگاری و رمزگشایی استفاده می‌شود.
سرعت بسیار سریع (مناسب برای حجم بالای داده).
مدیریت کلید چالش‌برانگیز، چون باید کلید بین فرستنده و گیرنده به صورت امن به اشتراک گذاشته شود.
مثال‌ها AES, DES, RC4, و Fernet.
کاربرد اصلی رمزنگاری داده‌های ذخیره‌شده (مثل دیتابیس) یا ارتباطات یک به یک با کلید از پیش تعیین شده.

رمزنگاری نامتقارن (مثل RSA) از دو کلید استفاده می‌کنه: یک کلید عمومی (Public Key) برای رمزنگاری و یک کلید خصوصی (Private Key) برای رمزگشایی. کلید عمومی می‌تونه در اختیار همه باشه، اما کلید خصوصی باید کاملاً مخفی بمونه. این روش برای تبادل کلیدها یا امضاهای دیجیتال عالیه، اما نسبت به متقارن خیلی کندتره. برای رمزنگاری انبوه متن، متقارن بهتره.

بهترین شیوه‌های امنیتی: کلیدها رو چطور نگه داریم؟

یادت نره، قدرت امنیت تو، به قدرت و نگهداری درست از کلیدت بستگی داره. اگه کلیدت لو بره، کل سیستم رمزنگاریت بی‌فایده می‌شه. اینجا چند تا پیشنهاد عالی برای نگهداری امن کلیدها دارم:

  • عدم هاردکد کردن کلید: هیچ‌وقت کلید رو مستقیم توی کدهات ننویس. این بدترین کار ممکنه!
  • متغیرهای محیطی: یکی از روش‌های امن، ذخیره کلید به عنوان یه متغیر محیطی (Environment Variable) در سیستم عاملته. اینطوری فقط برنامه‌ات می‌تونه بهش دسترسی داشته باشه و تو کد دیده نمیشه.
  • فایل‌های پیکربندی امن: می‌تونی کلید رو توی یه فایل جداگانه (مثل `key.key` که تو کد مثال زدیم) ذخیره کنی. اما حواست باشه که این فایل رو خارج از مسیر دسترس عمومی وب‌سرور یا پروژه (مثلاً در یک پوشعه با دسترسی‌های محدود) قرار بدی و همیشه از اضافه کردنش به سیستم کنترل نسخه (مثل Git) خودداری کنی.
  • سرویس‌های مدیریت کلید (Key Management Services – KMS): برای پروژه‌های بزرگ‌تر و سازمانی، استفاده از سرویس‌هایی مثل AWS KMS، Google Cloud KMS یا Azure Key Vault بهترین گزینه‌ست. این سرویس‌ها برای مدیریت، تولید و ذخیره امن کلیدها طراحی شدن.
  • رمزنگاری کلید اصلی (Key Encryption Key – KEK): حتی می‌تونی کلید اصلیت رو با یه کلید دیگه (که اون رو به صورت دستی وارد می‌کنی یا از جای امن‌تری میاد) رمزنگاری کنی. اینطوری یک لایه امنیتی بیشتر اضافه می‌کنی.

یادت باشه، امنیت یه فرآینده، نه یه مقصد. همیشه باید بهترین روش‌ها رو دنبال کنی و خودت رو به‌روز نگه داری.

عیب‌یابی سریع (Troubleshooting): مشکلات رایج و راه‌حل‌هاشون

خب، همیشه هم همه چی گل و بلبل نیست و ممکنه تو مسیر، به یه سری مشکل بربخوری. نگران نباش، این طبیعیه! اینجا به چند تا مشکل رایج و راه‌حلشون اشاره می‌کنم:

مشکل ۱: FileNotFoundError: [Errno 2] No such file or directory: 'secret.key'

توضیح: این یعنی فایل کلید (`secret.key` تو مثال ما) پیدا نشده.

راه‌حل:

  • مطمئن شو که کد generate_and_save_key() یا مشابه اون رو یک بار اجرا کردی تا فایل کلید ساخته بشه.
  • مسیر فایل کلید رو چک کن. آیا فایل توی همون پوشه‌ایه که اسکریپت پایتون رو ازش اجرا می‌کنی؟
  • اگه فایل رو جابجا کردی، مسیر جدید رو به تابع load_key() بده.

مشکل ۲: InvalidToken یا ValueError: Fernet key must be 32 url-safe base64-encoded bytes.

توضیح: این خطاها معمولاً یعنی کلیدی که برای رمزگشایی استفاده می‌کنی، با کلید رمزنگاری همخوانی نداره، یا اینکه داده‌های رمزنگاری شده خراب شدن.

راه‌حل:

  • کلید رو دوباره چک کن: مطمئن شو که داری از همون فایل secret.key که متن رو باهاش رمزنگاری کردی، برای رمزگشایی استفاده می‌کنی.
  • خرابی داده: ممکنه متن رمزنگاری شده تو حین انتقال یا ذخیره، تغییر کرده باشه. برای تست، اول رمزنگاری و بعد بلافاصله رمزگشایی رو تو همون اسکریپت امتحان کن.
  • فرمت کلید: مطمئن شو که کلید رو به درستی بارگذاری می‌کنی و فرمتش دقیقاً همون چیزیه که `Fernet` می‌خواد (۳۲ بایت base64-encoded).

مشکل ۳: TypeError: a bytes-like object is required, not 'str'

توضیح: این خطا می‌گه که `Fernet` به جای رشته (str)، انتظار بایت (bytes) داره.

راه‌حل:

  • قبل از ارسال متن به f.encrypt()، حتماً از .encode('utf-8') استفاده کن.
  • بعد از دریافت نتیجه از f.decrypt()، حتماً از .decode('utf-8') استفاده کن تا دوباره به رشته تبدیل بشه.

با این راه‌حل‌ها، بیشتر مشکلاتی که ممکنه پیش بیاد رو می‌تونی حل کنی. اگه بازم گیر کردی، مستندات کتابخونه `cryptography` تو وب‌سایت اصلیش همیشه بهترین مرجعن.

حرف آخر: امنیت دیتات با خودته!

رفیق برنامه‌نویس, دیدی چقدر راحت تونستیم با پایتون یه سیستم رمزنگاری ساده و کارآمد بسازیم؟ امنیت اطلاعات توی دنیای دیجیتال امروز، شوخی‌بردار نیست. با این کدهایی که یاد گرفتی و با رعایت نکات امنیتی، می‌تونی قدم بزرگی برای محافظت از داده‌هات برداری. این فقط یه شروع بود! دنیای رمزنگاری خیلی گسترده‌تره و میشه باهاش کارهای فوق‌العاده‌ای کرد.

پیشنهاد می‌کنم حتماً این کدها رو اجرا کنی، باهاشون بازی کنی و ببینی چطور کار می‌کنن. هر چی بیشتر دست به کد بشی، عمیق‌تر یاد می‌گیری. اگه دنبال اسنیپت‌های پایتون بیشتر یا حتی کدهای آماده CSS و JavaScript هستی، یه سر به صفحه اصلی fa-tools.ir بزن تا کلی ابزار و کدهای کاربردی دیگه هم پیدا کنی!

کدنویسی امن و بدون دردسر!

برای دریافت مشاوره تخصصی در زمینه امنیت نرم‌افزار، توسعه وب یا هر مشکلی که تو کدنویسی داری، همین الان با ما تماس بگیر!


📞 تماس بگیرید: 09202232789

Table of Contents

آخرین نوشته‌ها