مقدمهای بر الگوریتم رمزنگاری Base64
۲۰ بهمن ۱۳۹۹
احتمالا متوجه هستید که هر لحظه حجم عظیمی از دادهها در شبکههایی مانند رسانههای اجتماعی بین انسانها منتقل میشود و این دادهها میتوانند هر نوع فرمت دادهای را اعم از BLOB و CLOB شامل شوند. این دادهها برای انتقال در شبکه به 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 چگونه کار میکند؟
بیایید با یک مثال شروع کنیم تا بتوانید این الگوریتم رمزنگاری را بهتر درک کنید.
در تصویر بالا رشتهی THS
را با Base64، رمزنگاری کردهایم و خروجی برابر با VEhTCg==
است. حال شاید برایتان سوال شده باشد که مراحل این الگوریتم رمزنگاری چگونه است؟
در ابتدا تعداد کاراکترهای رشتهی ورودی ما شمارش میشود. اگر تعداد کاراکترهای رشتهی ورودی مضربی از عدد ۳ نبود کاراکتر =
بهمنظور padding در مراحل بعدی به انتهای رشتهی رمزنگاری شده اضافه میشود. سپس کاراکترهای ورودی به کدهای ASCII تبدیل شده و در مرحلهی بعد کدهای ASCII بهدست آمده به باینریهای ۸ بیتی تبدیل خواهند شد. همانطور که قبلتر گفتیم معماری رمزنگاری Base64 بهصورت ۶ بیتی است پس بایستی باینریهای ۸ بیتی بهصورت باینریهای ۶ بیتی جداسازی شوند و در مرحلهی آخر مقادیر Decimal باینریهای ۶ بیتی محاسبه شده و با استفاده از این جدول، مقادیر Decimal به رشتهی خروجی که همان رشتهی رمزنگاری شده است تبدیل میشود.
بیایید با دنبال کردن مراحل فوق رشتهی THS
را بهصورت دستی رمزنگاری کنیم. THS
از ۳ کاراکتر تشکیل شده است بنابراین نیازی به padding ندارد و در مرحله باید رشتهی ورودی را به کدهای ASCII تبدیل کنیم:
در مرحلهی بعد کدهای ASCII بهدست آمده را به فرمت باینری ۸ بیتی تبدیل خواهیم کرد:
باینریهای ۸ بیتی بایستی بهصورت ۶ بیتی از هم جداسازی شده و مقدار Decimal آنها محاسبه شود:
درنهایت برای بهدست آوردن نتیجهی پایانی رمزنگاری از این جدول استفاده خواهیم کرد:
خروجی رمزنگاری شدهی ما VEhT
خواهد بود. اما شاید برایتان سوال شده باشد که چرا خروجی بهدست آمده در تصویر مقدار VEhTCg==
بوده است؟
ما پس از وارد کردن دستور base64 <<< THS
دکمهی Enter را فشردهایم و Base64 آن را یک خط جدید حساب کرده است. برای ثابت کردن این موضوع به عکس زیر دقت کنید:
با اجرای دستور echo -n THS | base64
همان خروجی که در بخش قبلی حساب کرده بودیم را دریافت خواهیم کرد.
اگر تعداد کاراکترهای رشتهی ورودی ما مضربی از عدد ۳ نباشد چه اتفاقی میافتد؟
طبق اولین مرحلهی رمزنگاری Base64 اگر تعداد کاراکترهای رشتهی ورودی مضربی از عدد ۳ نباشد، paddingهایی با استفاده از کاراکتر =
ایجاد میشود. بیایید با یک مثال این موضوع را بهتر درک کنیم. فرض کنید که میخواهیم abraAbra
را رمزنگاری کنیم:
در این مثال تعداد کاراکترهای رشتهی ورودی ما مضربی از عدد ۳ نیست و باید یک کاراکتر =
در انتهای آن اضافه شود تا تعداد کاراکترها مضربی از عدد ۳ باشد. اما قبلا از اضافه کردن padding بایستی مقادیر ASCII را به باینریهای ۸ بیتی تبدیل کرده:
و سپس باینریهای ۸ بیتی بهصورت ۶ بیتی از هم جدا شوند. همچنین میتوانید padding را در این مرحله به انتهای رشته اضافه کرد. فراموش نکنید که مقادیر Decimal باینریهای ۶ بیتی را حساب کنید:
حال با در دست داشتن مقادیر Decimal میتوان با استفاده از این جدول خروجی نهایی رمزنگاری شده را محاسبه کرد:
خروجی نهایی ما مقدار YWjyYUFicmE=
بوده که احتمالا شما هم به نتیجهی یکسانی رسیده باشید.
منبع: https://levelup.gitconnected.com/what-is-base64-encoding-4b5ed1eb58a4