رمزنگاری (قسمت ۱)

بهترین راه برای درک تابع درهمسازی مقایسه آن با مخلوط کن است. یک طرف آن ساده است ولی طرف دیگر آن غیر ممکن!فرض کنید یک هکر یا خرابکار به طریقی موفق به دستیابی به پایگاه داده بانک شما شود. آنجا تمام اطلاعات کاربران و از جمله اطلاعات شما قرار دارد. ممکن است فکر کنید هکر قبل از هرچیز سراغ رمز عبور شما می رود و کل حساب بانکی شما را خالی میکند. اما متاسفانه بانک رمز عبور شما را ندارد! این برای رمز عبور جیمیل و مابقی حساب های کاربری شما هم صادق است. اما چگونه چنین چیزی ممکن است. بالاخره باید سایت بانک رمز شما را با رمزی که قبلا به آنها داده اید مقایسه کند و اگر یکسان بود اجازه ورود به شما بدهد. قبل از اینکه ادامه دهید قدری به این موضوع فکر کنید که چگونه ممکن است بانک بدون داشتن رمز شما همچنان بتواند شما را اعتبار سنجی کند.این اتفاق به صورتی بسیار جالب رخ می دهد. زمانی که شما رمز خود را برای اولین بار تنظیم می کنید. سیستم بانکی به جای ذخیره رمز عبور شما آن را به یک تابع می دهد و خروجی آن تابع را ذخیره می کند. بنابراین هر گاه شما رمز خود را وارد می کنید بانک دوباره رمز شما را به آن تابع داده و خروجی آن را با چیزی که ذخیره کرده است مقایسه می کند (رمز ذخیره نمیشود). خوب این کار چه فایده ای دارد؟ برای اینکه فایده این موضوع را درک کنید باید به چند ویژگی این تابع اشاره کنیم.قبل از همه چیز این تابع باید قطعی (deterministic) باشد، یعنی هر بار به ازای هر ورودی دقیقا یک خروجی مشخص تولید کند نه اعداد تصادفی! دومین ویژگی این تابع این است که باید یک به یک باشد. یعنی هیچ دو رمزی را به یک عدد نگاشت نکند که اگراین کار را بکند ممکن است به شخص دیگری با رمز دیگری اجازه دسترسی به اطلاعات شما را بدهد. و در نهایت مهم ترین ویژگی اینکه، پیدا کردن رمز شما با دانستن خروجی تابع «ناممکن‌‌‌» باشد. توابع در هم سازی یا hash function ها دقیقا چنین ویژگی هایی دارند. این توابع از اهمیت بسیار زیادی در رمزنگاری برخوردار هستند. به صورت نظری هیچ تابع درهم سازی ای کامل نیست. اما برخی از این توابع دارای ویژگی هایی هستند که آن ها را به یک تابع در هم سازی ایده آل بسیار نزدیک می کند. یکی از مشکلاتی که توابع در هم سازی دارند این است که در آنها امکان برخورد یعنی خروجی یکسان برای دو ورودی متفاوت صد در صد غیر ممکن نیست. اما در توابع در هم سازی خوبی که اکنون وجود دارند این احتمال آنقدر کوچک است که می توان گفت تقریبا غیر ممکن است.یکی از توابع در هم سازی بسیار مهم MD5 است که یک خروجی ۱۲۸ بیتی برای ورودی شما تولید میکند. البته این الگوریتم اکنون دیگر مورد استفاده قرار نمیگیرد چرا که ضعف های آن آشکار شده است. با این حال هنوز از آن در checksum ها استفاده می شود. الگوریتم جدی تری که در مورد وجود دارد SHA-2 است که دارای خروجی ۲۵۶ بیتی است. این الگوریتم توسط آژانس امنیت ملی آمریکا(NSA) در سال ۲۰۰۱ از الگوریتم های سری بیرون آمد و در اختیار پژوهشگران قرار گرفت. در این الگوریتم هیچ راهی برای بازیابی ورودی با استفاده از خروجی وجود ندارد مگر حدس زدن و تست کردن تمام حالات. بنابراین شما باید دو به توان ۲۵۶ حالت را بررسی کنید. برای اینکه بزرگی این عدد را درک کنید به این مثال توجه کنید: فرض کنید که تمامی افراد کره زمین یک گوگل داشته باشند و علاوه بر آن تمام سیاراتِ تمام منظومه هایِ تمام کهکشان ها ۷ میلیارد انسان داشته باشند. و ۳۷ برابر عمر جهان تمامی این افراد به محاسبه با گوگلشان ادامه بدهند در این صورت تازه بعد از آن مدت زمان احتمال حدس زدن درست آن ها یک در چهار میلیارد است!!![1]استحکام این الگوریتم رمز نگاری آنقدر زیاد است که از SHA-1 در الگوریتم بیت کوین هم استفاده می شود.ادامه دارد….پ.ن: (بانک همواره می تواند با حضور شما رمز شما را ریست کند در این صورت خروجی تابع قبلی در پایگاه داده پاک شده و خروجی تابع با رمز جدید در آن قرار می گیرد)در این جا می توانید تابع SHA-1 را به صورت آنلاین تست کنید[1] https://www.youtube.com/watch?v=S9JGmA5_unY&ab_channel=3Blue1Brown