برنامه‌نویسی

مقدمه‌ای بر الگوریتم رمزنگاری Base64

مقدمه‌ای بر الگوریتم رمزنگاری base64

احتمالا متوجه هستید که هر لحظه حجم عظیمی از داده‌ها در شبکه‌هایی مانند رسانه‌های اجتماعی بین انسان‌ها منتقل می‌شود و این داده‌ها می‌توانند هر نوع فرمت‌ داده‌ای را اعم از BLOB و CLOB شامل شوند. این داده‌ها برای انتقال در شبکه به packetهایی تبدیل می‌شوند که در خود داده‌های باینری را جای داده‌‌اند.

انتقال packetها در سرتاسر شبکه

BLOB و CLOB به چه معناست؟

BLOB به‌معنای Binary Large Object File است و داده‌هایی مانند تصویر، صدا یا فیلم در انتقال توسط شبکه به داده‌های BLOB معروف هستند. CLOB به‌معنای Character Large Object File است و داده‌هایی مانند text یا xml یا هر نوع فرمت کاراکتری دیگر از نوع داده‌های CLOB محسوب می‌شود.

الگوریتم رمزنگاری Base64 چیست؟

Base64 یک الگوریتم رمزنگاری binary به text است و به کمک آن می‌توانیم داده‌ها را در شبکه انتقال دهیم. همچنین تفاوتی نمی‌کند که چه داده‌ای را می‌خواهید رمزنگاری کنید زیرا با Base64 هر نوع داده‌ای به یک رشته طولانی از متن تبدیل می‌شود.

قبلا نمی‌توانستیم داده‌هایی مانند فایل‌ها را از طریق شبکه انتقال دهیم زیرا معماری این داده‌ها ۸ بیتی بود در صورتی که شبکه با معماری ۷ بیتی ساخته شده بود اما با رمزنگاری Base64 این مشکل نیز رفع شده است.

Base64 از داده‌های ۶ بیتی که ۶۴ کاراکتر را شامل می‌شوند و قابلیت خوانایی بالایی دارند، استفاده می‌کند:

  • ۱۰ مقدار عددی از ۰ تا ۹
  • ۲۶ حروف بزرگ از A تا Z
  • ۲۶ حروف کوچک از a تا z
  • ۲ کاراکتر خاص بستگی به سیستم‌عامل شما

Base64 چگونه کار می‌کند؟

بیایید با یک مثال شروع کنیم تا بتوانید این الگوریتم رمزنگاری را بهتر درک کنید.

رمزنگاری base64 رشته‌ی ths

در تصویر بالا رشته‌ی THS را با Base64، رمزنگاری کرده‌ایم و خروجی برابر با VEhTCg== است. حال شاید برایتان سوال شده باشد که مراحل این الگوریتم رمزنگاری چگونه است؟

در ابتدا تعداد کاراکترهای رشته‌ی ورودی ما شمارش می‌شود. اگر تعداد کاراکترهای رشته‌ی ورودی مضربی از عدد ۳ نبود کاراکتر = به‌منظور padding در مراحل بعدی به انتهای رشته‌ی رمزنگاری شده اضافه می‌شود. سپس کاراکترهای ورودی به کدهای ASCII تبدیل شده و در مرحله‌ی بعد کدهای ASCII به‌دست آمده به باینری‌های ۸ بیتی تبدیل خواهند شد. همان‌طور که قبل‌تر گفتیم معماری رمزنگاری Base64 به‌صورت ۶ بیتی است پس بایستی باینری‌های ۸ بیتی به‌صورت باینری‌‌های ۶ بیتی جداسازی شوند و در مرحله‌ی آخر مقادیر Decimal باینری‌های ۶ بیتی محاسبه شده و با استفاده از این جدول، مقادیر Decimal به رشته‌ی خروجی که همان رشته‌ی رمزنگاری شده است تبدیل می‌شود.

بیایید با دنبال کردن مراحل فوق رشته‌ی THS را به‌صورت دستی رمزنگاری کنیم. THS از ۳ کاراکتر تشکیل شده است بنابراین نیازی به padding ندارد و در مرحله باید رشته‌ی ورودی را به کدهای ASCII تبدیل کنیم:

تبدیل رشته‌ی ths به کدهای ascii

در مرحله‌ی بعد کدهای ASCII به‌دست آمده را به فرمت باینری ۸ بیتی تبدیل خواهیم کرد:

تبدیل کدهای ascii به باینری‌های ۸ بیتی

باینری‌های ۸ بیتی بایستی به‌صورت ۶ بیتی از هم جداسازی شده و مقدار Decimal آن‌ها محاسبه شود:

تبدیل باینری‌های ۸ بیتی به باینری‌های ۶ بیتی و به‌دست آوردن مقادیر demcimal آن‌ها

درنهایت برای به‌دست آوردن نتیجه‌ی پایانی رمزنگاری از این جدول استفاده خواهیم کرد:

به‌دست آوردن مقدار دقیق اعداد decimal با استفاده از base64 index table

خروجی رمزنگاری شده‌ی ما VEhT خواهد بود. اما شاید برایتان سوال شده باشد که چرا خروجی به‌دست آمده در تصویر مقدار VEhTCg== بوده است؟

ما پس از وارد کردن دستور base64 <<< THS دکمه‌ی Enter را فشرده‌ایم و Base64 آن را یک خط جدید حساب کرده است. برای ثابت کردن این موضوع به عکس زیر دقت کنید:

رمزنگاری base64 رشته‌ی ths

با اجرای دستور echo -n THS | base64 همان خروجی که در بخش قبلی حساب کرده بودیم را دریافت خواهیم کرد.

اگر تعداد کاراکترهای رشته‌ی ورودی ما مضربی از عدد ۳ نباشد چه اتفاقی می‌افتد؟

طبق اولین مرحله‌ی رمزنگاری Base64 اگر تعداد کاراکترهای رشته‌ی ورودی مضربی از عدد ۳ نباشد، paddingهایی با استفاده از کاراکتر = ایجاد می‌شود. بیایید با یک مثال این موضوع را بهتر درک کنیم. فرض کنید که می‌خواهیم abraAbra را رمزنگاری کنیم:

تبدیل رشته‌ی abraabra به کدهای ascii

در این مثال تعداد کاراکترهای رشته‌ی ورودی ما مضربی از عدد ۳ نیست و باید یک کاراکتر = در انتهای آن اضافه شود تا تعداد کاراکترها مضربی از عدد ۳ باشد. اما قبلا از اضافه کردن padding بایستی مقادیر ASCII را به باینری‌های ۸ بیتی تبدیل کرده:

تبدیل کدهای ascii به باینری‌های ۸ بیتی

و سپس باینری‌های ۸ بیتی به‌صورت ۶ بیتی از هم جدا شوند. همچنین می‌توانید padding را در این مرحله به انتهای رشته اضافه کرد. فراموش نکنید که مقادیر Decimal باینری‌های ۶ بیتی را حساب کنید:

تبدیل باینری‌های ۸ بیتی به باینری‌های ۶ بیتی و به‌دست آوردن مقادیر demcimal آن‌ها

حال با در دست داشتن مقادیر Decimal می‌توان با استفاده از این جدول خروجی نهایی رمزنگاری شده را محاسبه کرد:

به‌دست آوردن مقدار دقیق اعداد decimal با استفاده از base64 index table

خروجی نهایی ما مقدار YWjyYUFicmE= بوده که احتمالا شما هم به نتیجه‌ی یکسانی رسیده باشید.

منبع: https://levelup.gitconnected.com/what-is-base64-encoding-4b5ed1eb58a4