رمز ساده

رمز ساده

آسان

دستورالعمل‌ها

یک پیاده‌سازی از رمز ویگنر بسازید. رمز ویگنر یک رمز جانشینی ساده است.

اصطلاحات رمز

رمز یک الگوریتم است که برای رمزنگاری یا کدگذاری یک رشته به کار می‌رود. به رشته‌ی رمزنگاری‌نشده متن ساده و به رشته‌ی رمزنگاری‌شده متن رمز می‌گویند. تبدیل متن ساده به متن رمز کدگذاری و برعکس آن کدبرداری نامیده می‌شود.

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

جزئیات کدگذاری

در این رمز، کلید مجموعه‌ای از حروف کوچک است، مانند "abcd". هر حرف متن ساده بر اساس حرف متناظرش در کلید، به اندازه‌ی مشخصی جابه‌جا یا چرخانده می‌شود. یک "a" در کلید به معنای جابه‌جایی ۰ است (یعنی بدون جابه‌جایی). یک "b" در کلید به معنای جابه‌جایی ۱ است. یک "c" در کلید به معنای جابه‌جایی ۲ است و به همین ترتیب.

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

اگر کلید فقط یک حرف داشته باشد، مانند "dddddd"، آن‌گاه همه‌ی حروف متن ساده به یک اندازه جابه‌جا می‌شوند (در این مثال سه)، و این همان رمز چرخشی یا رمز جابه‌جایی می‌شود (که گاهی رمز سزار نامیده می‌شود). برای مثال، متن ساده "iamapandabear" به "ldpdsdqgdehdu" تبدیل می‌شود.

اگر کلید فقط حرف "a" باشد (یک بار یا بیشتر)، اندازه‌ی جابه‌جایی صفر است و متن رمز با متن ساده یکسان است.

البته معمولاً کلید پیچیده‌تر از این است! اگر کلید "abcd" باشد، حروف متن ساده به اندازه‌های ۰، ۱، ۲ و ۳ جابه‌جا می‌شوند. اگر متن ساده "hello" باشد، به ۵ جابه‌جایی نیاز داریم، پس کلید دور می‌خورد و اندازه‌های جابه‌جایی ۰، ۱، ۲، ۳ و ۰ می‌شوند. با اعمال این جابه‌جایی‌ها روی حروف "hello" به "hfnoo" می‌رسیم.

کلیدهای تصادفی

اگر کلیدی ارائه نشود، کلیدی تولید کنید که دست‌کم از ۱۰۰ حرف کوچک تصادفی از الفبای لاتین تشکیل شده باشد.

آیا باید اینجا از random یا secrets استفاده کنم؟

از Python ۳.۶ به بعد، دو ماژول متفاوت برای تولید اعداد «تصادفی» وجود دارد:

ماژولی که random نام دارد شبه‌تصادفی است، یعنی تصادفی‌بودن واقعی را تولید نمی‌کند، بلکه از الگوریتمی پیروی می‌کند که تصادفی‌بودن را شبیه‌سازی می‌کند. چون این «اعداد تصادفی» با الگوریتمی شناخته‌شده تولید می‌شوند، واقعاً تصادفی نیستند. در نتیجه، ماژول random برای رمزنگاری مناسب نیست و نباید استفاده شود، دقیقاً به این دلیل که شبه‌تصادفی است.

ماژولی که secrets نام دارد، اعداد «تصادفی» قوی از نظر رمزنگاری تولید می‌کند که امنیت بیشتر موردنیاز برای رمزنگاری را فراهم می‌کنند. آن‌ها در سخت‌گیرانه‌ترین معنای کلمه هنوز شبه‌تصادفی‌اند، اما این تضمین را دارند که اعدادی که تولید می‌کنند کاملاً غیرقابل‌پیش‌بینی‌اند.

چون این فقط یک تمرین عملی است، استفاده از ماژول random اشکالی ندارد، اما توجه کنید که اگر واقعاً برای رمزنگاری استفاده شود، بسیار ناامن خواهد بود.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Python Exercism

آماده‌اید رمز ساده را شروع کنید؟

در Exercism ثبت‌نام کنید تا Python را همراه با 17 مفهوم146 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.