دیکدر ریموت‌کنترل‌های هاپینگ

دیکدر ریموت کنترل های هاپینگ
358 بازدید
۱۴۰۴-۰۷-۲۲
9 دقیقه
  • نویسنده: Dani
  • درباره نویسنده: www.linkedin.com/in/danial-koosha

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

اگه بخوام خلاصه بگم، این ریموت‌ها دو نوع کُد ثابت (کُد فیکس) و هاپینگ (کُد متغیر) دارن.توی ریموت کدلرن و دکد همراه سورس برنامه آموزش عملکرد و دیکد نوع کُد ثابت اومده، نیاز به توضیح نداره که ریموت‌کنترل کُد فیکس با خودش چه چالش‌های امنیتی رو به همراه میاره.

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

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

این تراشه جزو اولین و قدیمی‌ترین انکدرهای بازاره که سطح امنیت قابل‌قبولی (نه ایده‌آل) رو ارائه می‌کنه.

توصیه می‌کنم حتماً نوع ۴ کلید رو انتخاب کنید تا بتونید از تمام قابلیت‌های جذاب HCS301 استفاده کنید.

مرور مفاهیم پایهٔ امنیت ریموت‌ها؛ از Replay Attack تا الگوریتم KeeLoq

پیش از این‌که ادامه بدیم، بد نیست یکی دوتا از این اصطلاحات رو با هم مرور کنیم؛ اصطلاحاتی مثل Hopping Code ،Rolling Code ،KeeLoq و Replay Attack.

  • Replay Attack: اسم نوعی حمله‌ی رایج در سیستم‌های کنترل از راه دوره که مهاجم، سیگنال واقعی‌ای رو که بین فرستنده و گیرنده ردوبدل شده، ضبط می‌کنه و خودش رو جای فرستنده جا می‌زنه و دقیقاً همون سیگنال رو می‌فرسته. (حمله‌ای که توی ریموت‌های کُد فیکس به‌سادگی جواب می‌ده!!!)
  • Rolling Code یا Hopping Code: یعنی هر بار با فشاردادن یه دکمه، یه کُد متفاوت نسبت به دفعه‌ی قبل تولید بشه؛ اما این تفاوت برای گیرنده قابل‌پیش‌بینی باشه، درحالی‌که مهاجم نتونه الگو رو حدس بزنه.
  • KeeLoq: یه الگوریتم رمزنگاری و سیستم Rolling Code اختصاصی هست که توسط شرکت Microchip Technology توسعه داده شده.

ساخت کلمهٔ کدِ ارسال‌شده (رمزگذار / انکودر)

عملکرد پایهٔ گیرنده دیکدر

فقط برای اینکه جا بیفته، Rolling Code یه مفهوم کلی تو حوزه‌ی امنیت ارتباطات بی‌سیمه که شرکت Microchip تصمیم گرفته با استفاده از الگوریتم KeeLoq اون رو پیاده‌سازی کنه.

با فشاردادن یک دکمه روی ریموت چه اتفاقی میفته؟

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

پکت دیتا شامل چه بخش‌هایی میشه؟

پکت شامل ۶۶ بیت دیتاست که ۳۲ بیت مربوط به بخش رمز (Encrypted Portion) و ۳۴ بیت مربوط به بخش ثابت (Fixed Portion) هست.

۳۲ بیت رمز:

  • Sync Counter (16 bit): با هر بار فشاردادن کلید، این کانتر یه واحد اضافه میشه.
  • DISC (10 bit): یه عدد ثابته که گیرنده هم می‌دونه، پس انتظار داریم اگه گیرنده رمز رو درست رمزگشایی کنه، به همین مقدار برسه. (برای اطمینان از صحت رمزگشایی استفاده میشه.)
  • OVR (2 bit): دو بیت مربوط به اورفلو (Overflow)
  • Button Status (4 bit): هر بیت وضعیت یکی از کلیدها رو نشون میده.

 

۳۴ بیت ثابت:

  • Serial Number (28 bit): یه مقدار منحصربه‌فرد هست که برای تشخیص هر ریموت استفاده میشه و داخل EEPROM آی‌سی ذخیره میشه.
  • Button Status (4 bit): هر بیت وضعیت یکی از کلیدها رو مشخص می‌کنه.
  • Vlow (1 bit): اگه ولتاژ باتری ریموت از سطح مشخصی پایین‌تر بیاد، این فلگ «۱» میشه.
  • Repeat (1 bit): وقتی یه دکمه نگه داشته بشه، این فلگ «۱» میشه.

ساختار یا سازمان‌دهی کلمهٔ کد

بعد از تولید پکت آی‌سی اطلاعات رو به چه شکلی انکد میکنه؟

نهایتاً سیگنال pwm خروجی مشابه فرمت پایین میشه.

  • Preamble: مقدمه‌ی هر پکت با ۱۲ تا پالس با دیوتی‌سایکل ۵۰٪ شروع میشه. عرض هر پالس به اندازه‌ی Tᴇ هست.
  • Header: به ‌اندازه‌ی ۱۰ × Tᴇ سطح سیگنال رو پایین می‌کشه.
  • Encrypted Portion: بخش رمزگذاری‌شده شامل ۳۲ بیت دیتا که از بیت کم‌ارزش (LSB first) ارسال شروع میشه.
  • Fixed Portion: بخش ثابت شامل ۳۴ بیت دیتا.

بیت 0/1 با مقایسه نسبت عرض پالس high و low معلوم میشه.

فرمت کلمهٔ کد

تا این‌جای کار، عملاً تمام وظایف تراشه رو توضیح دادیم. بعدازاین مرحله، مدار RF فرستنده سیگنال تولیدشده رو مدوله می‌کنه و توی محیط منتشر می‌کنه. بعدازاین با کمک یه گیرنده ASK دقیقاً همین سیگنال pwm رو می‌تونید دریافت کنید و با کمک یه میکروکنترلر دیکد کنید. (یه کتابخونه به همین منظور نوشتم که انتهای آموزش لینکش هست)

تو این مرحله پکت ارسال شده رو دیکد کردیم و می‌تونیم دیتای هر بخش رو پارس(parse)کنیم. بخش ثابت (Fixed Portion) تکلیفش مشخصه، به‌راحتی قابل‌استفاده هست. اما بخش رمزگذاری‌شده (Encrypted Portion) تا وقتی رمزگشایی نشه، عملاً قابل‌استفاده نیست. اینجاس که مفاهیم Hopping Code و الگوریتم KeeLoq نقش‌آفرینی می‌کنند.

شاید برای شما مفید باشد:
تایمرها در AVR | قسمت دهم آموزش میکروکنترلر AVR

الگوریتم keeloq چکار میکنه؟

خیلی اجمالی بخوام بگم، این الگورتیم یه دیتای ۳۲ بیتی رو به‌عنوان ورودی دریافت می‌کنه و با استفاده ازEncryption Key  (کلید رمزگذاری) عملیات رمزگذاری رو انجام میده. تو هر مرحله پنج بیت از دیتا رو برمی‌داره و با مقدار ثابت NLF و Encryption Key در هم xor میکنه و درنهایت یه متغیر ۳۲ بیتی به‌عنوان خروجی برمی‌گردونه که با فقط با داشتن مقدار Encryption Key میشه به ورودی اولیه رسید. (درصورتی‌که به الگوریتم‌های رمزنگاری علاقه‌مند هستین، میتونین خودتون راجع به KeeLoq و امنیتش بیشتر مطالعه کنید. چون الگوریتم قدیمی و شناخته‌شده‌ای هست، کتابخونه‌های زیادی توی GitHub هستن که منم از یکیشون استفاده کردم.)

الگوریتم keeloq

خب، اگه یه Encryption Key وجود داشته باشه که هم فرستنده (ریموت) و هم گیرنده (میکروکنترلر ما) اون رو بدونن، یه ارتباط امن بینشون شکل می‌گیره که فقط همون زوج فرستنده و گیرنده می‌تونن داده‌ها رو رمزگذاری (Encrypt) و رمزگشایی (Decrypt) کنن. گیرنده بعد از دریافت هر پکتی Serial Number رو بررسی می‌کنه و با Encryption Key مختص همان سریال، فرایند رمزگشایی را انجام می‌ده. سپس مقدار Discrimination رو چک می‌کنه تا از صحت رمزگشایی مطمئن بشه. در این مرحله، گیرنده به مقدار SYNC دسترسی داره و اون رو با مقدار SYNC قبلی که دریافت کرده بود مقایسه می‌کنه. مقدار SYNC جدید همیشه از مقدار قبلی بزرگ‌تر هست؛ چون هر بار که دکمه‌ای روی ریموت فشار داده می‌شه، شمارنده‌ی داخلی اون یکی مرحله جلوتر می‌ره.

البته ممکنه ریموت یه مدت دور از گیرنده بوده باشه و چند پالس ارسال کرده باشه که گیرنده اون‌ها رو نگرفته، بنابراین اختلاف بین مقدار SYNC قبلی و SYNC فعلی لزوماً دقیقاً ۱ نیست.

برای اینکه سیستم بتونه این سناریوها رو مدیریت کنه، معمولاً یه آستانه (Threshold) حدود ۱۶ تا ۳۲ عدد برای اختلاف بین این دو مقدار در نظر گرفته می‌شه؛ یعنی اگه مقدار SYNC جدید تو این بازه باشه، پکت معتبر تلقی می‌شه و رمزگشایی ادامه پیدا می‌کنه.

حالا اگه مقدار SYNC فعلی از مقدار قبلی کوچک‌تر باشه چی؟

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

ولی اگه این بار مقدار SYNC برگشته عقب، یعنی یا داده‌ی دریافتی خراب شده (به دلیل نویز یا خطای دریافت)، یا بدتر از اون، کسی داره سعی می‌کنه با استفاده از یه کلید لو رفته یا شبیه‌سازی‌شده، پکت‌های جعلی بفرسته.

به عبارتی، احتمال داره Encryption Key سیستم افشا شده باشه و یه مهاجم بخواد با تغییردادن دستی مقدار SYNC، خودش رو جای ریموت واقعی جا بزنه و قفل رو باز کنه.

حالا آیا می‌شه Encryption Key رو از EEPROM تراشه استخراج کرد؟

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

در واقع، این نوع حافظه‌ها فقط قابلیت نوشتن دارن؛ یعنی شما می‌تونین با هر مقداری پروگرام (Program) کنید، اما نمی‌تونین اون مقدار رو بخونید یا استخراج کنید.

HCS301 چگونه پروگرام می‌شود؟

این تراشه یک EEPROM با ظرفیت ۱۹۲ بیت داره (12 × 16-bit words) که در ادامه Memory Map (ساختار حافظه) رو آوردم تا مشخص بشه چه پارامترهایی قابل بازنویسی هستند.

  • Encryption Key: کلید رمزنگاری تو چهار سلول ابتدایی حافظه ذخیره می‌شه.
  • SYNC: همان مقدار کانتر داخلی است که هر بار یکی زیاد می‌شود، در یک خانه از حافظه ذخیره می‌شود.
  • Serial Number: شماره‌سریال مخصوص هر ریموته که با نوشتن در حافظه قابل‌تغییر هست.
  • SEED: دو خانه حافظه برای این متغیر در نظر گرفته شده است. (در ادامه درباره نقش بسیار مهم این متغیر توضیح میدم)
  • CONFIG: یکی از مقادیر مهمی که در CONFIG ذخیره می‌شه، Discrimination است که پیش‌تر توضیح دادم چه‌کار می‌کنه.
SEED چیست و چه‌کار میکنه؟

🌱 SEED یک متغیر کاملاً دل‌خواه که صرفاً جهت بالابردن امنیت سیستم طراحی شده. درصورتی‌که هر ۴ دکمه ریموت هم‌زمان فشار داده بشن، مقدار SEED ارسال میشه.

حالا با توضیحی که از عملکرد SEED دادم می‌تونید حدس بزنید چطور به امنیت کمک می‌کنه؟

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

با این کار، در واقع امنیت گاوصندوقم رو به اندازه‌ی قفل اون جعبه‌ی فلزی پایین آوردم — که طبیعتاً کار درستی نیست.همین اتفاق می‌تونه تو سیستم ما بیفته. چطوری؟

 اگه Encryption Key مستقیماً داخل حافظه میکروکنترلر هارد کد کنم، این احتمال وجود داره که یه نفر حافظه رو Dump کنه و با بررسی داده‌ها، چشمش به یه متغیر با مقدار عجیب بخوره. طبیعتاً اولین فکری که می‌کنه اینه که اون مقدار، همون کلید رمزنگاریه.

حالا SEED چه کمکی می‌تونی بکنه؟

اگه مبنای ساختن Encrption Key رو بر اساس مقدار SEED بزاریم، این‌طوری که مقدار SEED رو وارد یه الگوریتم دلخواه کنیم و خروجی رو به‌عنوان Encryption Key استفاده کنیم.

شاید برای شما مفید باشد:
آماده سازی محیط VSCODE برای برنامه نویسی AVR

با این کار هیچ مقداری از قبل در میکروکنترلر ذخیره نشده. برای داشتن کلید فقط کافیه هر چهار دکمه ریموت رو فشار بدیم تا SEED ارسال بشه و میکروکنترلر همون الگوریتم مشابه که برای تولید کلید روی ریموت اجرا شده رو استفاده کنه تا کلید رو به دست بیاره. به این کار Secure learn گفته می‌شه.

نکته‌ی مهم اینه که الگوریتم تولید کلید کاملاً دلخواه و مستقل از KeeLoq هست؛ یعنی شما می‌تونید هر تابع یا روش رمزنگاری دلخواهی رو برای این مرحله طراحی و استفاده کنید.

HCS301 چطور پروگرام میشه؟

فرایند پروگرام کردن تراشه شامل دو بخش programming و verify میشه. اول تراشه رو وارد مد programming می‌کنید، بعد ۱۹۲ بیت دیتا رو ارسال می‌کنید و به‌عنوان تأیید فرایند پروگرام مرحله verify شروع میشه، دقیقاً همون دیتایی که برای تراشه ارسال شده رو برمی‌گردونه.
نکته‌ی مهم اینجاست که مرحله‌ی Verify فقط یک‌بار و بلافاصله بعد از پروگرام انجام می‌شه و بعد از اون دیگه به‌هیچ‌وجه نمی‌شه محتوای EEPROM تراشه رو خوند.

شکل‌موج‌های برنامه‌نویسی و تأیید

خب این مقاله از نظر فنی همین‌جا تموم میشه، اماااااااا…

فرایند پروگرام HCS301 چالش‌های زیادی داره که اگه فک می‌کنید قراره شما هم یه روزی باهاش کار کنید، خوبه بدونید.

حس می‌کنم سر این پروژه جوونیم رفت =)

چرا؟

به این دلایل:

  • مهم‌تر از همه، توجه کنید که این آی‌سی دو نسخه‌ی دیتاشیت داره. معمولاً نتایج اول جست‌وجوی گوگل مربوط به ورژن قدیمه، در حالی که ورژن جدیدتر برای سال 2011ه.
  • جدول TABLE 6-1 مربوط به زمان‌بندی سیگنال‌ها در حین program و verify می‌شه. روی مقادیر این جدول خیلی حساب باز نکنید؛ دو مورد تناقض در عمل دیدم که توی کتابخونه‌ی خودم اصلاح شده‌شون رو قرار دادم. (پارامترهای Twc و Tpbw طبق داکیومنت جواب نمیدن، البته توی ورژن جدید یادمه مقادیر تغییر کرده بودن.)
  • آی‌سی در جواب هر 16bit (word) که دریافت می‌کنه، یه پالس ACK برمی‌گردونه که هیچ جا بش اشاره نشده، پس بعد از هر ارسال پین دیتا رو فلوت(float) کنید تا آی‌سی بتونه پالس ACK بفرسته، و بعد از اون میتوند ۱۶ بیت بعدی رو بفرستید.
  • باتری ۱۲ ولت ریموت رو جدا کنید و تغذیه ۵ ولت از برد خودتون تأمین کنید، باتری رو انقد دور بزارید که هیچ‌وقت به‌صورت اتفاقی دوباره متصلش نکنین، چون اون موقع یه میکروکنترلر هم ضرر می‌کنین 🙂
  • برای پروگرام کردن، نیازی به دمونتاژ آی‌سی از روی برد ریموت نیست، کافیه دوتا سیم نازک به پایه‌های PWM به‌عنوان data و S3 به‌عنوان clock لحیم کنید.

چند تا عکس از سیگنال‌های مهم توی نرم‌افزار Saleae Logic گذاشتم که کمکتون می‌کنه.
توی داکیومنت‌های پروژه هم فایل کامل لاجیک آنالیزر رو گذاشتم که می‌تونید import کنید.

programming mode entrance

programming mode entrance

verify signal return all EEPROM

verify signal return all EEPROM

 
ack pulse after each word write

ack pulse after each word write

🧠 نکته مهم

و نهایتاً اگه فک می‌کنید ریموت‌های Rolling Code نفوذ ناپذیرن و تا الان کسی موفق به هک اونا نشده، اشتباه می‌کنید. تو مقاله‌ی بعدی راجع به روش این ریموت‌ها صحبت می‌کنم.
توی همین آموزش به مشکل امنیتی ریموت‌های KeeLoq اشاره کردم، پس شما هم ممکنه یه ایده‌هایی داشته باشین.
GitHub Logomark لینک گیت‌هاب پروژه

 

اطلاعات
358
0
2
اشتراک و حمایت
profile نویسنده: Dani متخصص الکترونیک

www.linkedin.com/in/danial-koosha


ویراستار: مریم میریان
مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله