رمزنگار

رمزنگار

تمرین یادگیری

مقدمه

در Cairo، یکی از مفاهیم اصلی که با آن روبه‌رو می‌شوید نوع felt252 است که با نام عضو میدان هم شناخته می‌شود. این نوع، اعداد صحیح را در محدوده‌ی مشخصی نمایش می‌دهد که با یک عدد اول بزرگ $P$ تعریف می‌شود. در این تمرین، فقط با نوع felt252 کار می‌کنید که بخشی ضروری از برنامه‌نویسی Cairo است.

نوع felt252 در Cairo یک نوع اسکالر است که برای نمایش اعداد صحیح از ۰ تا $P - 1$ به کار می‌رود؛ $P$ یک عدد اول بزرگ است که در حال حاضر برابر $( 2^{251} + 17 \cdot 2^{192} + 1 )$ قرار داده شده است. این نوع تضمین می‌کند که همه‌ی عملیات حسابی به پیمانه‌ی $P$ انجام می‌شوند و همین آن را از انواع استاندارد اعداد صحیح که ممکن است در زبان‌های برنامه‌نویسی دیگر ببینید، متمایز می‌کند.

Cairo از عملیات حسابی پایه روی مقادیر felt252 پشتیبانی می‌کند:

  • جمع (+): دو مقدار felt252 را با هم جمع می‌کند. اگر نتیجه از $P$ بیشتر شود، به پیمانه‌ی $P$ کاهش می‌یابد.
  • تفریق (-): یک مقدار felt252 را از مقدار دیگر کم می‌کند. اگر نتیجه منفی شود، با افزودن مضربی از $P$ طوری تنظیم می‌شود که در محدوده باقی بماند.
  • ضرب (*): دو مقدار felt252 را در هم ضرب می‌کند و نتیجه به پیمانه‌ی $P$ محاسبه می‌شود.
  • تقسیم (/): یک مقدار felt252 را بر مقدار دیگر تقسیم می‌کند و تضمین می‌کند که نتیجه در معادله‌ی $( \frac{x}{y} \cdot y = x \mod P)$ صدق کند.

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

در این تمرین، به یک رمزنگار کمک می‌کنید تا یک سیستم ارتباطی امن را مدیریت و بررسی کند. این سیستم به‌شدت به «عناصر میدان»، به‌طور مشخص نوع felt252 در Cairo، وابسته است تا مطمئن شود همه‌ی عملیات حسابی در بازه‌ی تعریف‌شده‌ای باقی می‌مانند.

1. محاسبه‌ی مجموع دو پیام

دو پیام رمزنگاری‌شده که هر کدام به‌صورت یک felt252 نمایش داده می‌شوند، باید با هم جمع شوند تا یک پیام ترکیبی بسازند. اما به دلیل رمزنگاری، هر نتیجه‌ای که از بیشترین مقدار $P - 1$ فراتر برود، باید با پیمانه‌ی $P$ دوباره به درون بازه برگردد.

تابعی پیاده‌سازی کنید که دو مقدار felt252 می‌گیرد و مجموعشان را برمی‌گرداند، به گونه‌ای که نتیجه در بازه‌ی معتبر باقی بماند:

add_messages(3618502788666131213697322783095070105623107215331596699973092056135007822949, 987654321)
// => 123456789

توجه: مقدار بازگشتی باید از نوع felt252 باشد.

2. محاسبه‌ی تفاضل دو پیام

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

تابعی پیاده‌سازی کنید که دو مقدار felt252 می‌گیرد و تفاضلشان را برمی‌گرداند، به گونه‌ای که نتیجه در بازه‌ی معتبر باقی بماند:

subtract_messages(123456789, 987654321)
// => 3618502788666131213697322783095070105623107215331596699973092056135007822949

توجه: مقدار بازگشتی باید از نوع felt252 باشد.

3. محاسبه‌ی حاصل‌ضرب معتبر دو پیام

برای تضمین یکپارچگی داده‌های رمزنگاری‌شده، سیستم رمزنگاری اغلب دو پیام (felt252) را در هم ضرب می‌کند تا مطمئن شود حاصل‌ضربشان در بازه‌ای معتبر می‌ماند. نتیجه باید به پیمانه‌ی $P$ محاسبه شود تا در بازه‌ی معتبر باقی بماند.

تابعی پیاده‌سازی کنید که دو مقدار felt252 می‌گیرد و حاصل‌ضربشان را برمی‌گرداند، به گونه‌ای که نتیجه در بازه‌ی معتبر باقی بماند:

multiply_messages(382927772233671078546147897004315551461400594453673204174697055647611, 9449570)
// => 123456789

توجه: مقدار بازگشتی باید از نوع felt252 باشد.

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

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

در Exercism ثبت‌نام کنید تا Cairo را همراه با 25 مفهوم68 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.