آموزش رمزنگاری به زبان ساده؛ بخش سوم: رمزهای چند الفبایی (Polyalphabetic Ciphers)

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

0 1,471

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

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

https://cdn-images-1.medium.com/max/800/1*TpPOS_vOtpCzoZBGS0x3HA.png

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

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

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

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

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

راه حل میانه این دو می‌تواند خلق رمزی باشد که دنباله ارقام آن را می‌توان به راحتی به اشتراک گذاشت. اینجا است که Polyalphabetic Ciphers وارد عمل می‌شود. در قرن پانزدهم رمزنگاران به این ایده دست یافتند که به جای ارقام از حروف به عنوان کلید استفاده کنند. بیایید ببینیم که ایده چگونه کار می‌کند.

فرض کنید می‌خواهید یک پیام محرمانه را با اعضای خانواده خود به اشتراک بگذارید. شما باز هم از عملیات رمز سزار استفاده می‌کند (به عبارت دیگر شیفت حروف به سمت جلو)، اما به جای استفاده از یک رقم مانند ۳، از کلمه‌ای مثل FAMILY استفاده خواهید کرد.

هر یک از حروف الفبا یک جایگاه دارد و عددی به آن جایگاه نسبت داده شده است. A به عنوان اولین حرف الفبا با ۱، B با ۲، C با ۳ و … نمایش داده می‌شود. می‌توانیم از این دنباله برای تبدیل کلمه FAMILY به دنباله‌ای از ارقام استفاده کنیم.

https://cdn-images-1.medium.com/max/800/1*JHBlHsnA0IgyO7uBB5x12g.png

می‌توانید ببینید که این کار چقدر سودمند است. یادآوری FAMILY بسیار آسان‌تر از به یاد آوردن ۶-۱-۱۳-۹-۱۲-۲۵ است. و شما می‌توانید به راحتی با استفاده از یک کلمه طولانی‌تر دنباله‌ای طولانی‌تر یا حتی یک جمله داشته باشید.» شما اکنون به نحوی تصادفی بودن را شبیه‌سازی کرده‌اید.

بنابراین، چگونه می‌توانید از این کلید شبه تصادفی استفاده کنید؟ برای رمزنگاری یک پیام، می‌توانید هر حرف پیامتان را به وسیله اعداد موجود در کلیدتان (همان اعدادی ۶، ۱ و… که در حروف کلمه FAMILY بود) به چند حرف جلوتر شیفت دهید و هنگامی که به انتهای ارقام رسیدید، دنباله اعداد را تکرار کنید.

https://cdn-images-1.medium.com/max/800/1*kF5frq8D6TDx0Re88sRqoQ.png

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

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

تنها تفاوت این است که به جای تنها رسم نمودار تناوب حروف برای پیدا کردن الگو، کاشفان رمز باید از آزمون و خطا برای پیدا کردن طول دنباله کلید استفاده کنند. وقتی که طول آن را پیدا کنند و بدانند که هر حرف پنجم در پیام رمزنگاری شده از یک شیفت تبعیت می‌کند، می‌توانند با حل ردیفی رمز سزار و شیفت دادن هر حرف پنجم به میزان ۶ حرف و شیفت دادن هر حرف ششم به میزان ۱ حرف و هر حرف هفتم به میزان ۱۳ حرف و … رمز را بشکنند.

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

برای امن‌تر ساختن رمز، باید از دنباله کلیدی طولانی‌تری استفاده کنیم. هرچه دنباله طولانی‌تر باشد، کاشف رمز باید فواصل بیشتری را بیازماید. هدف ما به عنوان خالق رمز این است که این فرآیند آزمون و خطا را تا حد امکان طولانی کنیم، تا جایی که انجام این کار برای کاشف رمز عملی نباشد. تصور کنید که شکستن رمز برای کاشف رمز به جای ۵ بار تلاش، ۱۰۰ بار یا ۱۰۰۰ بار طول بکشد. حال تصور کنید که این کار صدها سال به طول بیانجامد. عملا غیر ممکن است که کسی این زمان را برای شکستن رمز ما اختصاص دهد.

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

شاید از این مطالب هم خوشتان بیاید.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.