الگوریتم رمزنگاری KeeLoq یک روش رمزنگاری با کلید متقارن 64 بیتی است که توسط میکروچیپ توسعه داده شده. در این قسمت ما به نحوه عملکرد الگوریتم رمزنگاری و رمزگشایی کیلاک میپردازیم و در نهایت یک کد به زبان C برای استفاده رائه میکنیم.
رمزنگاری متقارن (Symmetric Encryption) یک روش رمزنگاری است که در آن یک کلید واحد برای رمزگذاری و رمزگشایی دادهها استفاده میشود. این کلید باید بین دو طرفی که در حال تبادل اطلاعات هستند به اشتراک گذاشته شود.
اصلی ترین کاربرد این الگوریتم به دلیل قابلیت پیاده سازی ساده، در سیستم های ریموت کنترل دیده میشود. امروزه شرکت میکروچیپ با ساخت انکودرهای هاپینگ و رولینگ کد ( مشابه HCS301 ) که از این الگوریتم برای رمزنگاری اطلاعات ارسال شده استفاده میکنند به شکل قابل توجهی توانسته امنیت ریموت های درب پارکینگ، خانه، راهبندها، دزدگیرها و بساری از خودروها ( ازجمله ایرانخودرو ) را افزایش دهد.
شایان ذکر است که در موارد بالا فرستنده از یک کانتر در اطلاعات رمزنگاری استفاده میکند، اینکار باعث میشود که هر دیتای ارسال شده، متفاوت با قبلی باشد و این عمل باعث مقاومت بالای سیستم در برابر حملات شنود و بازپخش شود.
روند کلی رمزنگاری KeeLoq را میتوان در تصویر زیر مشاهده کرد، در ادامه به توضیح این روند خواهیم پرداخت.

برای شروع رمزنگاری از یک کلید 64 بیتی ثابت (آرایه پایینی در تصویر فوق) استفاده میشود، در حالی که دیتای 32 بیتی (آرایه بالایی در تصویر فوق) باید در یک حافظه متغیر ذخیره شود چون در هر دور اجرای الگوریتم، مقدار آن تغییر خواهد کرد.
قبل از اجرای الگوریتم باید مقدار کلید و دیتا را به الگوریتم داد، پس از 528 بار اجرا شدن الگوریتم، مقدار دیتا تغییر خواهد کرد و مقدار جدید دیتا درواقع مقدار تبدیل به رمز شده خواهد بود.
بیت های خاصی از دیتا (1،9،20،26،31) در کنار هم قرار میگیرند و تشکیل یک عدد 5 بیتی را میدهند.
این عدد میتواند بین 0 تا 31 باشد، محدوده مناسب برای انتخاب یک بیت از یک متغیر 32 بیتی!
از این عدد برای ماسک کردن یک بیت از رشته NLF استفاده میشود، مقدار بیت انتخاب شده وارد مرحله بعد میشود.
در این مرحله عملیات XOR بیتی بین چند ورودی انجام میشود و خروجی وارد مرحله بعد میشود.
بیت A : اولین بیت کلید (در دورهای بعدی: دومین، سومین ، … ، آخرین ، اولین ، دومین ، … )
بیت B : بیت خروجی از مرحله 1
بیت C : بیت 0 دیتا
بیت D : بیت 16 دیتا
خروجی = A xor B xor C xor D
متغیر 32 بیتی دیتا، یک بیت به سمت راست شیفت داده میشود و جای خالی ایجاد شده در پر اهمیت ترین بیت آن (بیت31) با مقداری که از مرحله 2 به دست آمد پر میشود.
برو به مرحله 1 و این کار را 528 بار انجام بده.
مقدار دیتا 32 بیتی الان شامل مقدار تبدیل به رمز شده توسط الگوریتم KeeLoq است!
پایان!
برای رمزگشایی توسط الگوریتم KeeLoq کافیه همه مسیرها رو برعکس بریم!
پس مطابق روند نمای زیر پیش میریم:

قبل از اجرای الگوریتم باید کلید 64 بیتی و مقدار دیتای 32 بیتی رمز شده جهت رمزگشایی رو به الگوریتم داد.
بیت های خاصی از دیتا (0،8،19،25،30) در کنار هم قرار میگیرند و تشکیل یک عدد 5 بیتی را میدهند.
این عدد میتواند بین 0 تا 31 باشد، محدوده مناسب برای انتخاب یک بیت از یک متغیر 32 بیتی!
از این عدد برای ماسک کردن یک بیت از رشته NLF استفاده میشود، مقدار بیت انتخاب شده وارد مرحله بعد میشود.
در این مرحله عملیات XOR بیتی بین چند ورودی انجام میشود و خروجی وارد مرحله بعد میشود.
بیت A : بیت پانزده کلید (در دورهای بعدی هربار یک بیت کم میشود. مثال: بیت14 ، بیت13 ، … ، بیت0 ، بیت63 ، بیت 62 ، … )
بیت B : بیت خروجی از مرحله 1
بیت C : بیت 31 دیتا
بیت D : بیت 15 دیتا
خروجی = A xor B xor C xor D
متغیر 32 بیتی دیتا، یک بیت به سمت چپ شیفت داده میشود و جای خالی ایجاد شده در کم اهمیت ترین بیت آن (بیت0) با مقداری که از مرحله 2 به دست آمد پر میشود.
برو به مرحله 1 و این کار را 528 بار انجام بده.
مقداردیتا 32 بیتی الان شامل مقدار رمزگشایی شده توسط الگوریتم KeeLoq است!
پایان!
با توجه به کاربرد این الگوریتم در سیستم های کنترلی رادیویی ، صنعت الکترونیک و میکروکنترلر، کدهای نوشته شده باید توانایی بالا و کمترین سرعت اجرا را روی ادوات الکترونیک داشته باشند. از این رو زبان اسمبلی گزینه خوبی برای محصول میتواند باشد ولی به دلیل نزدیکی و وابستگی به ماشین و قابلیت فهم کم آن، همچنین اهداف آموزشی کد ها به زبان C نوشته شده اند ولی سعی شده کدها به صورت بهینه و با قابلیت پیاده سازی روی اکثر سیستم های میکروکنترلری و کامپیوتری ارائه شوند.
مشتاقانه به یاری شما منتظر ارتقاع سطح پروژه ها هستیم.
برای دیدن یه کاربرد واقعی از این الگوریتم یه نگاه به پست پروژه گیرنده ریموت کنترل هاپینگ کد بنداز!
توضیح الگوریتم رمزگشایی و رمزگذاری KeeLoq در مقاله زیر مرحله به مرحله بیان شده، با روشن شدن نحوه عملکرد، میشه این الگوریتم رو به هر زبونی نوشت و روی هرچیزی ازش استفاده کرد.
عالی! دمت گررم خدایی ...