محصولات الکترونیکی زیادی تو بازار هست که برای ارتباط بیسیم از ریموتکنترلها استفاده میکنن. توی مقاله همه چیز درباره ریموت کنترلهای هاپینگ دربارهی اونا و عملکردشون توضیحات مفصلی داده شده که پیشنهاد میکنم قبل از ادامهی آموزش، اون مطالب رو مطالعه کنی.
اگه بخوام خلاصه بگم، این ریموتها دو نوع کُد ثابت (کُد فیکس) و هاپینگ (کُد متغیر) دارن.توی ریموت کدلرن و دکد همراه سورس برنامه آموزش عملکرد و دیکد نوع کُد ثابت اومده، نیاز به توضیح نداره که ریموتکنترل کُد فیکس با خودش چه چالشهای امنیتی رو به همراه میاره.
متأسفانه، مطالبی که توی نت فارسی دربارهی ریموتهای هاپینگ موجوده، یا جنبهی تجاری و غیرعلمی دارن، یا پولی هستن.پس دستبهکار شدم و این آموزش رو آماده کردم.
اگه به فروشگاههای دوربین و دزدگیر مراجعه کنید و قصد خرید یه ریموتکنترل هاپینگ داشته باشین، بین تمام انتخابهایی که جلوی روتون میذارن، اکثراً از تراشههای HCS301 شرکت Microchip استفاده شده.
این تراشه جزو اولین و قدیمیترین انکدرهای بازاره که سطح امنیت قابلقبولی (نه ایدهآل) رو ارائه میکنه.
پیش از اینکه ادامه بدیم، بد نیست یکی دوتا از این اصطلاحات رو با هم مرور کنیم؛ اصطلاحاتی مثل Hopping Code ،Rolling Code ،KeeLoq و Replay Attack.


کلید توسط آیسی تشخیص داده میشه و یه پکت دیتا تولید میشه که شامل دو بخشه: بخش رمزگذاریشده و بخش ثابت. انکدر آیسی اون رو به یه سیگنال PWM تبدیل میکنه و از یکی از پایههای HCS301 خارج میشه. بعد، این سیگنال وارد یه مدار RF ساده (مدولاتور ASK) میشه و در نهایت روی آنتن فرستاده میشه.
پکت شامل ۶۶ بیت دیتاست که ۳۲ بیت مربوط به بخش رمز (Encrypted Portion) و ۳۴ بیت مربوط به بخش ثابت (Fixed Portion) هست.

نهایتاً سیگنال pwm خروجی مشابه فرمت پایین میشه.
بیت 0/1 با مقایسه نسبت عرض پالس high و low معلوم میشه.

تا اینجای کار، عملاً تمام وظایف تراشه رو توضیح دادیم. بعدازاین مرحله، مدار RF فرستنده سیگنال تولیدشده رو مدوله میکنه و توی محیط منتشر میکنه. بعدازاین با کمک یه گیرنده ASK دقیقاً همین سیگنال pwm رو میتونید دریافت کنید و با کمک یه میکروکنترلر دیکد کنید. (یه کتابخونه به همین منظور نوشتم که انتهای آموزش لینکش هست)
تو این مرحله پکت ارسال شده رو دیکد کردیم و میتونیم دیتای هر بخش رو پارس(parse)کنیم. بخش ثابت (Fixed Portion) تکلیفش مشخصه، بهراحتی قابلاستفاده هست. اما بخش رمزگذاریشده (Encrypted Portion) تا وقتی رمزگشایی نشه، عملاً قابلاستفاده نیست. اینجاس که مفاهیم Hopping Code و الگوریتم KeeLoq نقشآفرینی میکنند.
خیلی اجمالی بخوام بگم، این الگورتیم یه دیتای ۳۲ بیتی رو بهعنوان ورودی دریافت میکنه و با استفاده ازEncryption Key (کلید رمزگذاری) عملیات رمزگذاری رو انجام میده. تو هر مرحله پنج بیت از دیتا رو برمیداره و با مقدار ثابت NLF و Encryption Key در هم xor میکنه و درنهایت یه متغیر ۳۲ بیتی بهعنوان خروجی برمیگردونه که با فقط با داشتن مقدار Encryption Key میشه به ورودی اولیه رسید. (درصورتیکه به الگوریتمهای رمزنگاری علاقهمند هستین، میتونین خودتون راجع به KeeLoq و امنیتش بیشتر مطالعه کنید. چون الگوریتم قدیمی و شناختهشدهای هست، کتابخونههای زیادی توی GitHub هستن که منم از یکیشون استفاده کردم.)

خب، اگه یه Encryption Key وجود داشته باشه که هم فرستنده (ریموت) و هم گیرنده (میکروکنترلر ما) اون رو بدونن، یه ارتباط امن بینشون شکل میگیره که فقط همون زوج فرستنده و گیرنده میتونن دادهها رو رمزگذاری (Encrypt) و رمزگشایی (Decrypt) کنن. گیرنده بعد از دریافت هر پکتی Serial Number رو بررسی میکنه و با Encryption Key مختص همان سریال، فرایند رمزگشایی را انجام میده. سپس مقدار Discrimination رو چک میکنه تا از صحت رمزگشایی مطمئن بشه. در این مرحله، گیرنده به مقدار SYNC دسترسی داره و اون رو با مقدار SYNC قبلی که دریافت کرده بود مقایسه میکنه. مقدار SYNC جدید همیشه از مقدار قبلی بزرگتر هست؛ چون هر بار که دکمهای روی ریموت فشار داده میشه، شمارندهی داخلی اون یکی مرحله جلوتر میره.
البته ممکنه ریموت یه مدت دور از گیرنده بوده باشه و چند پالس ارسال کرده باشه که گیرنده اونها رو نگرفته، بنابراین اختلاف بین مقدار SYNC قبلی و SYNC فعلی لزوماً دقیقاً ۱ نیست.
برای اینکه سیستم بتونه این سناریوها رو مدیریت کنه، معمولاً یه آستانه (Threshold) حدود ۱۶ تا ۳۲ عدد برای اختلاف بین این دو مقدار در نظر گرفته میشه؛ یعنی اگه مقدار SYNC جدید تو این بازه باشه، پکت معتبر تلقی میشه و رمزگشایی ادامه پیدا میکنه.
در حالت عادی شمارندهی SYNC همیشه باید افزایش پیدا کنه، چون هر بار که کلیدی روی ریموت زده میشه، مقدارش یکی بیشتر میشه.
ولی اگه این بار مقدار SYNC برگشته عقب، یعنی یا دادهی دریافتی خراب شده (به دلیل نویز یا خطای دریافت)، یا بدتر از اون، کسی داره سعی میکنه با استفاده از یه کلید لو رفته یا شبیهسازیشده، پکتهای جعلی بفرسته.
به عبارتی، احتمال داره Encryption Key سیستم افشا شده باشه و یه مهاجم بخواد با تغییردادن دستی مقدار SYNC، خودش رو جای ریموت واقعی جا بزنه و قفل رو باز کنه.
جواب خیر، چون اگه شما بتونین این کار رو انجام بدین، یعنی افراد دیگه هم میتونن همین کار رو بکنن و در نتیجه کلید امنیتی سیستم لو میره.
در واقع، این نوع حافظهها فقط قابلیت نوشتن دارن؛ یعنی شما میتونین با هر مقداری پروگرام (Program) کنید، اما نمیتونین اون مقدار رو بخونید یا استخراج کنید.
این تراشه یک EEPROM با ظرفیت ۱۹۲ بیت داره (12 × 16-bit words) که در ادامه Memory Map (ساختار حافظه) رو آوردم تا مشخص بشه چه پارامترهایی قابل بازنویسی هستند.
🌱 SEED یک متغیر کاملاً دلخواه که صرفاً جهت بالابردن امنیت سیستم طراحی شده. درصورتیکه هر ۴ دکمه ریموت همزمان فشار داده بشن، مقدار SEED ارسال میشه.
حالا با توضیحی که از عملکرد SEED دادم میتونید حدس بزنید چطور به امنیت کمک میکنه؟
فک کنید من ایمنترین گاوصندوق دنیا رو دارم، اما کلیدش رو داخل یه جعبهی فلزی میذارم و اون جعبه رو هم قفل میکنم!!!
با این کار، در واقع امنیت گاوصندوقم رو به اندازهی قفل اون جعبهی فلزی پایین آوردم — که طبیعتاً کار درستی نیست.همین اتفاق میتونه تو سیستم ما بیفته. چطوری؟
اگه Encryption Key مستقیماً داخل حافظه میکروکنترلر هارد کد کنم، این احتمال وجود داره که یه نفر حافظه رو Dump کنه و با بررسی دادهها، چشمش به یه متغیر با مقدار عجیب بخوره. طبیعتاً اولین فکری که میکنه اینه که اون مقدار، همون کلید رمزنگاریه.
اگه مبنای ساختن Encrption Key رو بر اساس مقدار SEED بزاریم، اینطوری که مقدار SEED رو وارد یه الگوریتم دلخواه کنیم و خروجی رو بهعنوان Encryption Key استفاده کنیم.
با این کار هیچ مقداری از قبل در میکروکنترلر ذخیره نشده. برای داشتن کلید فقط کافیه هر چهار دکمه ریموت رو فشار بدیم تا SEED ارسال بشه و میکروکنترلر همون الگوریتم مشابه که برای تولید کلید روی ریموت اجرا شده رو استفاده کنه تا کلید رو به دست بیاره. به این کار Secure learn گفته میشه.
نکتهی مهم اینه که الگوریتم تولید کلید کاملاً دلخواه و مستقل از KeeLoq هست؛ یعنی شما میتونید هر تابع یا روش رمزنگاری دلخواهی رو برای این مرحله طراحی و استفاده کنید.
فرایند پروگرام کردن تراشه شامل دو بخش programming و verify میشه. اول تراشه رو وارد مد programming میکنید، بعد ۱۹۲ بیت دیتا رو ارسال میکنید و بهعنوان تأیید فرایند پروگرام مرحله verify شروع میشه، دقیقاً همون دیتایی که برای تراشه ارسال شده رو برمیگردونه.
نکتهی مهم اینجاست که مرحلهی Verify فقط یکبار و بلافاصله بعد از پروگرام انجام میشه و بعد از اون دیگه بههیچوجه نمیشه محتوای EEPROM تراشه رو خوند.

خب این مقاله از نظر فنی همینجا تموم میشه، اماااااااا…
فرایند پروگرام HCS301 چالشهای زیادی داره که اگه فک میکنید قراره شما هم یه روزی باهاش کار کنید، خوبه بدونید.
حس میکنم سر این پروژه جوونیم رفت =)
به این دلایل:
چند تا عکس از سیگنالهای مهم توی نرمافزار Saleae Logic گذاشتم که کمکتون میکنه.
توی داکیومنتهای پروژه هم فایل کامل لاجیک آنالیزر رو گذاشتم که میتونید import کنید.

programming mode entrance

verify signal return all EEPROM

ack pulse after each word write
| لینک گیتهاب پروژه |
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.