آزمایشگاه Ink & Switch فرمت رمزگذاری Bijou64 را معرفی کرد تا باگ‌های تغییرپذیری امضا در پروتکل‌های همگام‌سازی را از ریشه حذف کند. این ساختار عدد صحیح با طول متغیر (varint)، هر عدد را دقیقاً به یک دنباله بایت یکتا نگاشت می‌کند و سرعت رمزگشایی را تا 10 برابر افزایش می‌دهد.

بروکلین زلنکا (Brooklyn Zelenka)، توسعه‌دهنده این فرمت، با تکیه بر طراحی ساختاری Bijou64، دسته‌ای از باگ‌های کانونیکال را که غالباً پروتکل‌های باینری را درگیر می‌کنند، هدف قرار داده است. بنچمارک‌ها نشان می‌دهند این روش عملکرد بهتری نسبت به رمزگشاهای اسکالر استاندارد LEB128 دارد.

مشکل رمزگذاری‌های سنتی در پروتکل‌های باینری

متغیرهای صحیح سنتی مانند LEB128، اعداد را به قطعات 7 بیتی تقسیم می‌کنند. این روش اجازه می‌دهد یک عدد واحد دنباله‌های بایت متعدد و معتبری داشته باشد؛ مثلاً عدد صفر هم می‌تواند به صورت 0x00 و هم 0x80 0x00 رمزگذاری شود. در سیستم‌های مبتنی بر امضاهای رمزنگاری، آدرس‌دهی محتوا یا اجماع توزیع‌شده، این افزونگی سطح حمله را گسترش می‌دهد.

مشخصات فنی ملزم می‌کنند رمزگشاها ورودی‌های غیرکانونیکال را رد کنند، اما زلنکا اشاره می‌کند توسعه‌دهندگان اغلب این بررسی‌های اعتبارسنجی را حذف یا بهینه‌سازی می‌کنند. این کاستی منجر به نقص‌های امنیتی مشابه آسیب‌پذیری‌های تاریخی در PKCS#1 v1.5، GnuTLS و تغییرپذیری تراکنش‌های بیت‌کوین می‌شود.

Bijou64 با غیرممکن کردن رمزگذاری‌های جایگزین در سطح ساختاری، این مشکل را حل می‌کند. زلنکا در این باره می‌گوید:

این همان دسته باگی است که Bijou64 طراحی شده تا آن را غیرممکن کند. نه با افزودن بررسی‌های بیشتر، بلکه با حذف آن موردی که اهمیت داشت؛ تا قالبی ساخته شود که بدون هیچ بررسی کانونیکالیتی، تنها یک رمزگذاری برای هر مقدار وجود داشته باشد.

نمودار ساختار رمزگذاری Bijou64 و مقایسه عملکرد با LEB128

مکانیزم‌های ساختاری فرمت Bijou64

این طراحی بر دو اصل پایه استوار است:

  • مقادیر مستقیم (0 تا 247): بایت اولیه در این محدوده، مقدار عدد صحیح را مستقیماً و بدون فراداده اضافی نشان می‌دهد.
  • بایت‌های برچسب و آفست‌ها (248 تا 255): این بایت‌ها مشخص می‌کنند چند بایت payload در ادامه می‌آید. هر سطح طول، یک آفست ثابت اضافه می‌کند تا مقادیر کوچک‌تر نتوانند با پدینگ (padding) به سطوح بزرگ‌تر منتقل شوند.

از آنجا که payload یک عدد صحیح پیوسته big-endian است، کامپایلرها می‌توانند رمزگشایی را به یک بارگذاری و تعویض بایت (byte swap) واحد تبدیل کنند. روی سخت‌افزارهای x86 و ARM، Bijou64 اعداد کوچک را تقریباً 2 برابر سریع‌تر از LEB128 و اعداد بزرگ‌تر را 8 تا 10 برابر سریع‌تر رمزگشایی می‌کند. این سرعت به دلیل پرهیز از ماسک‌های بیتی و اسکن‌های بیت ادامه‌دار در LEB128 به دست می‌آید.

واکنش جامعه کاربری و نقد عملکرد

بحث‌های جامعه کاربری در Hacker News چالش‌های این فرمت را برجسته کرد. یکی از کاربران با استناد به بنچمارک‌های فرمت BONJSON استدلال کرد مقایسه با رمزگشاهای اسکالر نادیده گرفته است که تجزیه با کارایی بالا به سمت دستورالعمل‌های SIMD حرکت کرده است:

تست‌ها ثابت کردند وقتی به دستورالعمل‌های SIMD می‌روید، به دلیل موازی‌سازی، ULEB128 همیشه پیروز می‌شود. نکته طعنه‌آمیز این است که حتی تجزیه متن با SIMD هم از این پیشی می‌گیرد! SIMD تا این حد قدرتمند است.

کاربر دیگری با نام dzaima ادعای امنیتی اصلی را زیر سؤال برد و اشاره کرد Bijou64 سطح مرزی بررسی‌شده را محدود می‌کند، نه اینکه اعتبارسنجی در زمان اجرا (runtime) را کاملاً حذف کند:

فراموش کردن بررسی محدوده برای حالت first_byte==255 دقیقاً به همان اندازه باگ محتملی است. Bijou64 شاید حتی مشکل‌سازتر باشد؛ زیرا شما را ترغیب می‌کند برای ورودی‌های کوچک‌تر هیچ بررسی محدوده‌ای انجام ندهید و در نتیجه حالت حداکثر طول را فراموش کنید.

همچنین برخی اشاره کردند فرمت‌های غیرکانونیکال مانند LEB128 به طور عمدی در WebAssembly و DWARF برای پدینگ ارجاعات استفاده می‌شوند تا پچ‌کردن درجا (in-place patching) برای ابزارهای خاص ممکن شود.

در دسترس بودن و پورتها

پیاده‌سازی مرجع Bijou64 به زبان Rust در crates.io با مجوزهای دوگانه MIT و Apache 2.0 در دسترس است. همچنین wrapperهای جاوااسکریپتی در npm و نسخه‌های جامعه‌ساخته در Elixir، Go، Perl و Java عرضه شده‌اند. نسخه‌های متنوع Bijou32 و Bijou128 نیز در مستندات پوشش داده شده‌اند.

با ارائه این فرمت، Ink & Switch نشان می‌دهد چگونه طراحی‌های معماری هوشمندانه می‌توانند پیچیدگی‌های امنیتی را پیش از اجرای کد مدیریت کنند و راه را برای پروتکل‌های توزیع‌شده امن‌تر هموار سازند.