سلام دوست عزیز😃👋
به مسابقه «مسابقه کداستار ۱۴۰۳ - Software Engineering» خوش آمدی!
نکات مفید برای شرکت در مسابقه:
chatGPT
و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکتکنندگان مسابقه حذف میشوید.لینکهای مفید برای شرکت در مسابقه:
موفق باشید و بهتون خوش بگذره 😉✌
Java, C#, C++
شرلوک پس از کشف راز قتل اندرسون توسط موریآرتی تصمیم میگیرد اسرار این جنایت مخوف را برای پلیس افشا کند به همین دلیل میخواهد نامهای برای بازرس لستراد بنویسد و این راز را برملا کند. موریآرتی در شبکه پست مزدورانی دارد که نامهها را به صورت مخفیانه بررسی میکنند؛ از آنجا که شرلوک نمیخواهد موریآرتی متوجه کشف این راز توسط او بشود، تصمیم میگیرد که نامه را به صورت رمزنگاری شده برای بازرس ارسال کند. در این سوال شما باید در رمزنگاری نامه به شرلوک کمک کنید!
ابتدا باید هر حرف در زبان انگلیسی را مستقل از بزرگ یا کوچک بودن، به یک عدد از 0 تا 25 نگاشت کنیم و در محاسبات رمزنگاری از آن عدد استفاده کنیم.
حرف | عدد |
---|---|
A | 0 |
B | 1 |
C | 2 |
D | 3 |
E | 4 |
F | 5 |
G | 6 |
H | 7 |
I | 8 |
J | 9 |
K | 10 |
L | 11 |
M | 12 |
N | 13 |
O | 14 |
P | 15 |
Q | 16 |
R | 17 |
S | 18 |
T | 19 |
U | 20 |
V | 21 |
W | 22 |
X | 23 |
Y | 24 |
Z | 25 |
برای تبدیل متن انگلیسی معنادار (plaintext
) به متن رمزشده (ciphertext
) میتوان از الگوریتمهای مختلفی استفاده کرد:
Additive Cipher
توضیح: در این روش، هر حرف متن اصلی با شیفت دادن به تعداد مشخصی از حروف در الفبا، به رمز تبدیل میشود.
پارامترها:
text
(متن اصلی)key
(کلید، که یک عدد صحیح است و مقدار شیفت را مشخص میکند)مثال:
text
: "hello"key
: 3رمزنگاری:
نتیجه رمز شده: "KHOOR"
دستور:
Multiplicative Cipher
توضیح: در این روش، هر حرف متن اصلی با ضرب در یک کلید به رمز تبدیل میشود.
پارامترها:
text
(متن اصلی)key
(کلید، که یک عدد صحیح است و با 26 نسبت به هم اولاند)مثال:
text
: "hello"key
: 3رمزنگاری:
نتیجه رمز شده: "VMHHQ"
دستور:
Affine Cipher
توضیح: این روش ترکیبی از رمزنگاری جمعی و ضربی است، به این صورت که هر حرف متن اصلی ضرب در یک کلید میشود و سپس به نتیجه کلید دوم اضافه میشود.
پارامترها:
text
(متن اصلی)a
(کلید ضربی، که یک عدد صحیح است و با 26 نسبت به هم اولاند)b
(کلید جمعی، که یک عدد صحیح است)مثال:
text
: "hello"a
: 5b
: 8رمزنگاری:
نتیجه رمز شده: "RCLLA"
دستور:
Mapping Cipher
توضیح: در این روش، هر حرف متن اصلی به یک حرف دیگر در الفبا مطابق با یک نگاشت از پیش تعریف شده تبدیل میشود.
پارامترها:
text
(متن اصلی)mapping
(نگاشت حروف، به صورت رشتهای که ترتیب جدید حروف الفبا را نشان میدهد)مثال:
text
: "hello"mapping
: "zyxwvutsrqponmlkjihgfedcba" (نگاشت معکوس الفبا)رمزنگاری:
نتیجه رمز شده: "SVOOL"
دستور:
همانطور که در مثالها آمده است، فرمت کلی هر دستور به شکل زیر است:
که در آن cipher-type
، نوع الگوریتم رمز و سایر موارد، پارامترهای آن الگوریتم رمز هستند. پارامترهایی که بین []
آمدهاند، بسته به الگوریتم رمزنگاری ممکن است در دستور وجود نداشته باشند.
ترتیب پارامترها میتواند متفاوت باشد. برای مثال دو دستور زیر معادل هستند:
فاصلههای اطراف متن معنادار نادیده گرفته میشوند و در متن رمزشده مشاهده نمیشوند. اما فاصلههای بین کلمات دقیقا در متن رمز شده میآید:
بزرگی یا کوچکی حروف در متن معنادار مهم نیست. بنابراین متن رمزشده برای دو متن معنادار hello
و Hello
یکسان خواهد بود.
ورودی شامل خط است. در خط اول ، تعداد دستورات میآید. در خط بعدی، در هر خط یک دستور رمزنگاری آمدهاست.
در خروجی به ازای هر دستور، نتیجه رمزنگاری را با حروف بزرگ در یک خط چاپ کنید.
در دستور اول، متن معنادار از نظر بزرگی یا کوچکی حروف فرقی نمیکند. بنابراین اگر help me
را بخواهیم با الگوریتم Additive Cipher
رمز کنیم، محاسبات به صورت زیر است:
key
برابر یک است. بنابراین هر کاراکتر در متن معنادار با عدد 1 جمع میشود. چون عدد حاصل باید بین 0 تا 25 باشد، باقیماندهی حاصل جمع را بر عدد 26 بدست میآوریم. سپس در جدول نگاشت حروف انگلیسی به اعداد، حرف انگلیسی متناظر عدد بدست آمده را به عنوان کاراکتر رمزشده درنظر میگیریم. کاراکتر فاصله بین کلمات نیز دقیقا در متن رمز شده میآید.
بنابراین متن رمز شده، IFMQ NF
خواهد بود.danger
را بخواهیم با الگوریتم Multiplicative Cipher
و کلید با مقدار 3 رمز کنیم، محاسبات به صورت زیر است: در دستور دوم، صرفا جای پارامترها عوض شده و محاسبات مانند دستور قبل است.در این مثال، محاسبات رمزنگاری به صورت زیر است:
در این مثال، پارامتر a
کلید ضربی و پارامتر b
کلید جمعی است. بنابراین حروف متن معنادار در a
ضرب و با b
جمع میشوند.
بنابراین متن رمز شده، WZ
خواهد بود.
در این مثال، mapping
داده شده برابر "zyxwvutsrqponmlkjihgfedcba"
است. به عبارت دیگر نگاشت حروف انگلیسی به متن رمز شده به صورت زیر است:
با توجه به نگاشت بالا، متن hello
به این صورت رمز میشود:
بنابراین متن رمز شده، SVOOL
خواهد بود.