رمزنگاری قسمت متقارن – symmetric cryptography

مطلبی رو که امروز به آن می پردازیم رمزنگاری یا به عبارتی (AES,DES,RSA,ECC) رو شامل میشود. رمزنگاری از سالها پیش در قرون باستان کشف و برای مخفی نگه داشتن اطلاعات مورد استفاده قرار میگرفته است.

رمزنگاری اصولا شامل دو حالت می باشد: حالت عمومی یا متقارن (symmetric) وحالت علمی یا نامتقارن (asymmetric) . که در این پست ما به تشریح رمزنگاری متقارن خواهیم پرداخت و تفصیل رمزنگاری نامتقارن را به زمانی دیگر موکول خواهیم کرد.

رمزنگاری متقارن Symmetric:

در گذشته برای رساندن پیامهای مهم ایالتی به داریوش اول از رمزنگاری استفاده می شد.تا اگر چاپارهای پارسی از بابل به سمت پاسارگاد در حرکت بودند و مورد حمله مهاجمان قرار می گرفتند متن نامه گویا نباشد.نامه‌ هایی را که فرمانروهای ایالات برای داریوش مینوشتند با یک اصطلاحا کلید که صرفا خود داریوش از آن خبر داشت بازنویسی میکردند و اصل نامه را از بین می بردند، به این ترتیب داریوش میتوانست با همان کلید مشخص آن را رمزگشایی کند.
با این روش می توان نوشته‌های خام را نیز رمزگذاری کرد. جهت انجام این کار الگوریتمهای زیادی در دسترس میباشد که مهمترین آنها DES یا Data Encryption Standard و نسخه تکامل یافته آن AES یا Advanced Encryption Standard است. حال برای اینکه این دو را توضیح بدیم باید بپرسیم که اساسا الگوریتمهای رمزنگاری به چه صورتند که این دو مهم‌ترین این رمزنگاریها هستند که به استاندارد تبدیل شده اند.

DES

خوب به لطف چاپارهای پارسی با مدل متقارن آشنا شدیم و این فقط شکل شماتیک مسئله است. در واقع در عمق ماجرا تقسیم بندیهای بیشتری وجود دارد. علی القاعده وقتی وارد دنیای کامپیوترها می شویم. پیشرفتهای رمزنگاری از زمان چاپارها تا عصر ربات ها شامل تحولات عمده‌ای است. مثلا در عصر ارتباطات از الگوریتم  RC4 یا Ron Rivest’s Cipher که از آن در تجارت الکترونیک استفاده شد و یا A5 که از آن در ارتباطات GSM مورد استفاده قرار گرفت. اما اینها در تقسیم بندی Stream Cipher گنجانده میشود. با توجه به گستردگی زیاد و تقسیم بندی مباحث از اکثر آنها گذر میکنیم و روی موضوع اصلی تمرکز میکنم. Block Cipher موضوع اصلی این بحث است. در این تقسیم بندی الگوریتم DES سالها نقش مرد زحمت کش داستان را ایفا میکرد. زمانی که از رمزنگاری روی بلاکهای داده صحبت میکنیم در دنیای کامپیوتر هستیم و دیگر هیچ …
در این تقسیم بندی DES میتواند بلاک به بلاک یک داده را رمزنگاری میکند و این در حالیست که تقسیم بندی Stream این بیت به بیت صورت میگیرد. تفاوت اینجاست که اگر یک حجم مشخص که مثلا در DES با ۶۴ بیت از داده در نظر گرفته میشود و با ۵۶ بیت رمزنگاری شود تا بلاکهای ۶۴ بیتی رمزشده تولید بشود. در واقع در این مدل هر بیت داده خام در کل بلاک رمز شده گسترانیده شده است.

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

الگوریتم DES در سال ۱۹۷۵ توسط IBM بر اساس طراحی Horst Feistel منتشر شد. بعد از این در ۱۹۷۶ توسط NSA به عنوان کارآمدترین الگوریتم و مقاوم ترین الگوریتم شناخته شد و در سال ۱۹۷۷ توسط FIPS منتشر شد.

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

این مدل جدید سه زیر مجموعه داشت که استاندارد شده و منتشر شده‌اند CBC, CFB و OFB که هر مدل روش خود را برای مرحله رمزنگاری و ترکیب آن با دیتای خام دارند و بنابراین هر کدام مشخصا نتیجه‌های متفاوت تولید می کردند. و در نهایت مدلی چهارمی ECB یا Electronic code book ارائه شده که از مدلهای فوق بهره نمی گرفت و صرفا استفاده دیتا بلاک رمزشده خودش بود. در نهایت هنر همه این مدلها عهده دار مخفی کردن الگوهای قابل رویت از DES بودند.

در نهایت همه اینها جواب داد DES به همراه مدلهای پیرو به صورت عمومی و در وسعت جهانی استاندارد شدند. بد این نیست اینجا به این اشاره کنیم که رمزگذاری خوب چه ویژگیهای باید داشته باشد:

  • زیر ساختی که مجری رمز کردن است. اگر شما در حال رمز کردن اطلاعات بسیار مهم هستید و این اطلاعات توسط آدم بدها به راحتی از طریق فیزیکی قابل دسترس باشد، به راحت قبل از رمز شدن آنها قابل کپی شدن هستند.
  • همچنین نگهداری از کلید. اگر کلید به هر دلیلی به دست کسانی که نباید بیفتد تمام این الگوریتمها و مدلها و زحمتهای طراحان و توسعه دهندگان آن هیچ میشود. آدم بد داستان با کلید در گاوصندوق را مثل ماست باز میکند.
  • حجم کلید هم مسئله حائز اهمیتی است. وقتی آدم بده دسترسی به اصل کلید نداشته باشد یکی از اولین کارهای که می‌آزماید حدس زدن کلید توسط روش Brute-Force است. به معنی آزمون و خطا که خود روشها و الگوریتمهای متفاوتی دارد و حوصله این بحث خارج است. بنابراین هر چه حجم بزرگ کلید(به زبان ساده تعداد کارکترهای آن) بزرگتر باشد حدس زدن آن نیز به روش سیستماتیک سخت تر است.
  • کیفیت الگوریتم. که در این باب قضاوت کردن بسیار سخت است. در نهایت یکی از الگوریتمها از بین همه الگوریتمهای خوب به عنوان بهترین انتخاب و استاندارد می شود، سپس به صورت گسترده در سطح جهان مورد استقبال قرار میگیرد. نگارنده مایل است که شما خواننده عزیز تشویق به مطالعه بیشتر در این خصوص نماید.

AES

و اما پسر DES جناب AES که قبلا گفتیم یعنی Advanced Encryption Standard سال ۱۹۸۸ یعنی وقتی که DES خود ۲۲ ساله بود توسط دو رمزنگار بلژیگی Vincent Rijmen و Joan Daemen طراحی شد. این الگوریتم یک زیر مجموعه از RBC بود که توسط افراد یاد شده به NIST برای شرکت در مسابقه AES Selection process ارائه و ثبت گردید. این الگوریتم جدید که میتونست داده با حجم بلاک بزرگتر یعنی ۱۲۸ بیت  و همچنین کلید بزرگتر یعنی ۱۲۸، ۱۹۲ و یا ۲۵۶ بیتی رمزنگاری توسط NIST در سال ۲۰۰۱ به این افتخار که AES بشه نائل آمد.
این استاندارد یک فرق بزرگ دیگه هم با پدرش DES دارد و آن این است که DES طراحی شده بود که بر روی سخت افزار ذخیره شود و نیاز شده بود که از مدلی برای استفاده شدن در نرم‌افزارها بهره گرفته شود. از آنجایی که AES تقریبا استاندارد جدید محسوب میشد زمان طول کشید که تا همه گیر و در سطح جهانی گسترده و استفاده بشود. در بین سالهای ۲۰۰۱ تا ۲۰۰۲ از AES در تکنولوژی هایی مثل VPN یا محصولا اصلی فایروال بهره گرفته شد و نهایتا در سال تابستان ۲۰۰۲ از طرف Internet Engineering Task Force به عنوان رمزنگار پروتوکل بسیار مهم SSL مورد استفاده قرار گرفت. این الگوریتم در مرحله انتخاب الگوریتم غلب برای AES رقبای بزرگی از شرکتهای مهمی را شکست داد:

  • الگوریتم MARS از IBM
  • الگوریتم RC6 از RSA Laboratories
  • الگوریتم Serpent توسط تعداد از محققان بین المللی مستقل

#!/usr/bin/env python3
import sys
import os
from cryptography.fernet import Fernet #cryptography 
import argparse


parser = argparse.ArgumentParser(description="Cypher is and cipher and decipher cli tool")
parser.add_argument('-c', '--cipher', default=True, help="encrypt a text")
parser.add_argument('-d', '--decipher', default=None, help="decrypt a text")
args = parser.parse_args()
if len(sys.argv) < 2:
    parser.print_usage()
    exit()
# Denifnation der Variablen

def encrypter():
    raw_text = sys.argv[1]
    byte_text = raw_text.encode()
    key = Fernet.generate_key()
    file = open('.key.key', 'wb')
    file.write(key)
    file.close()
    f = Fernet(key)
    encrypted = f.encrypt(byte_text)
    return("Encrypted test: %s nn%s"%(encrypted.decode(), key.decode()))

def decrypter():
    encrypted = sys.argv[1].encode()
    file = open('.key.key', 'rb')
    key = file.read()
    file.close()
    f = Fernet(key)
    decrypted = f.decrypt(encrypted)
    return(decrypted)

if sys.argv[1] == "-c" or sys.argv[1] == "--cipher":
    print(encrypter())
elif sys.argv[1] == "-d" or sys.argv[1] == "--decipher":
    print(decrypter())

دیدگاه‌ها

2 پاسخ به “رمزنگاری قسمت متقارن – symmetric cryptography”

  1. Salam
    Kheyle mamnoon. Kashki un yeki ham tozih dade boodi

    1. سلام فرناز،
      بزودی قسمت دومش رو مینویسم

پاسخی بگذارید

%d وب‌نوشت‌نویس این را دوست دارند: