وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

رمزگذاری و رمزگشایی رشته های Base64 در پایتون

0 206
زمان لازم برای مطالعه: 7 دقیقه


معرفی

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

کدگذاری Base64 به ما امکان می دهد بایت های حاوی داده های باینری یا متنی را به کاراکترهای ASCII تبدیل کنیم. با رمزگذاری داده های خود، شانس پردازش صحیح آنها توسط سیستم های مختلف را افزایش می دهیم.

در این آموزش، روش کار رمزگذاری و رمزگشایی Base64 و روش استفاده از آن را خواهیم آموخت. سپس از Python برای کدگذاری و رمزگشایی متن و داده های باینری Base64 استفاده می کنیم.

Base64 Encoding چیست؟

رمزگذاری Base64 نوعی تبدیل بایت ها به کاراکترهای ASCII است. در ریاضیات، پایه یک سیستم اعداد به تعداد کاراکترهای مختلف اعداد اشاره دارد. نام این رمزگذاری مستقیماً از تعریف ریاضی پایه ها می آید – ما 64 کاراکتر داریم که نشان دهنده اعداد هستند.

مجموعه کاراکتر Base64 شامل:

  • 26 حرف بزرگ
  • 26 حرف کوچک
  • 10 عدد
  • + و / برای خطوط جدید (برخی از پیاده سازی ها ممکن است از کاراکترهای مختلف استفاده کنند)

وقتی کامپیوتر کاراکترهای Base64 را به باینری تبدیل می کند، هر کاراکتر Base64 نشان دهنده 6 بیت اطلاعات است.

توجه داشته باشید: این یک الگوریتم رمزگذاری نیست و نباید برای اهداف امنیتی استفاده شود.

اکنون که می دانیم رمزگذاری Base64 چیست و چگونه نمایش داده می شود روی یک کامپیوتر، بیایید عمیق تر به روش کار آن نگاه کنیم.

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

ما روش عملکرد رمزگذاری Base64 را با تبدیل داده های متنی نشان خواهیم داد، زیرا استانداردتر از فرمت های باینری مختلف برای انتخاب است. اگر بخواهیم Base64 رشته ای را رمزگذاری کنیم این مراحل را دنبال می کنیم:

  1. مقدار ASCII هر کاراکتر در رشته را در نظر بگیرید
  2. معادل باینری 8 بیتی مقادیر ASCII را محاسبه کنید
  3. با گروه بندی مجدد ارقام، تکه های 8 بیتی را به تکه های 6 بیتی تبدیل کنید.
  4. گروه های باینری 6 بیتی را به مقادیر اعشاری مربوطه تبدیل کنید.
  5. با استفاده از جدول رمزگذاری base64، کاراکتر base64 مربوطه را برای هر مقدار اعشاری اختصاص دهید.

بیایید ببینیم که چگونه با تبدیل رشته “Python” به یک رشته Base64 کار می کند.

مقادیر ASCII کاراکترها P, y, t, h, o, n هستند 15, 50, 45, 33, 40, 39 به ترتیب. ما می توانیم این مقادیر ASCII را به صورت باینری 8 بیتی به صورت زیر نمایش دهیم:

01010000 01111001 01110100 01101000 01101111 01101110

به یاد داشته باشید که کاراکترهای Base64 تنها 6 بیت داده را نشان می دهند. اکنون توالی های باینری 8 بیتی را دوباره به تکه های 6 بیتی گروه بندی می کنیم. باینری حاصل به صورت زیر خواهد بود:

010100 000111 100101 110100 011010 000110 111101 101110

توجه داشته باشید: گاهی اوقات ما نمی توانیم داده ها را به دنباله های 6 بیتی گروه بندی کنیم. اگر این اتفاق افتاد، باید دنباله را pad کنیم.

با داده های خود در گروه های 6 بیتی، می توانیم مقدار اعشاری را برای هر گروه بدست آوریم. با استفاده از آخرین نتیجه، مقادیر اعشاری زیر را بدست می آوریم:

20 7 37 52 26 6 61 46

در نهایت، این اعشار را با استفاده از جدول تبدیل Base64 به کاراکتر Base64 مناسب تبدیل می کنیم:

جدول رمزگذاری Base64

همانطور که می بینید، ارزش 20 با حرف مطابقت دارد U. سپس نگاه می کنیم 7 و مشاهده کنید که به آن نگاشت شده است H. با ادامه این جستجو برای تمام مقادیر اعشاری، می توانیم تعیین کنیم که “Python” به صورت نمایش داده می شود UHl0aG9u زمانی که Base64 کدگذاری شد. می توانید این نتیجه را با یک مبدل آنلاین تأیید کنید.

برای کدگذاری Base64 یک رشته، آن را به دنباله های باینری، سپس به دنباله های اعشاری تبدیل می کنیم، و در نهایت، از یک جدول جستجو برای به دست آوردن یک رشته از کاراکترهای ASCII استفاده می کنیم. با درک عمیق تر از روش کار، بیایید ببینیم چرا Base64 داده های خود را رمزگذاری می کنیم.

چرا از Base64 Encoding استفاده کنیم؟

در رایانه ها، همه داده ها از انواع مختلف به صورت 1 و 0 ارسال می شوند. با این حال، برخی از کانال های ارتباطی و برنامه های کاربردی قادر به درک تمام بیت های دریافتی نیستند. این به این دلیل است که معنای دنباله ای از 1s و 0s وابسته است روی نوع داده ای که نشان می دهد. مثلا، 10110001 اگر بیانگر یک حرف یا یک تصویر باشد، باید متفاوت پردازش شود.

برای رفع این محدودیت، می‌توانید داده‌های خود را روی متن رمزگذاری کنید و شانس انتقال و پردازش صحیح آن‌ها را افزایش دهید. Base64 یک روش محبوب برای دریافت داده های باینری به کاراکترهای ASCII است که به طور گسترده توسط اکثر شبکه ها و برنامه ها قابل درک است.

یک سناریوی رایج در دنیای واقعی که در آن از رمزگذاری Base64 به شدت استفاده می شود، در سرورهای پستی هستند. آنها در ابتدا برای مدیریت داده های متنی ساخته شده بودند، اما ما همچنین انتظار داریم که آنها تصاویر و سایر رسانه ها را با پیام ارسال کنند. در این موارد، داده‌های رسانه‌ای شما هنگام ارسال با Base64 کدگذاری می‌شوند. سپس هنگام دریافت Base64 رمزگشایی می شود تا برنامه بتواند از آن استفاده کند. بنابراین، برای مثال، تصویر در HTML ممکن است شبیه به این باشد:

<img src="data:image/png;base64,aVRBOw0AKg1mL9...">

با درک اینکه گاهی اوقات داده ها باید به صورت متن ارسال شوند تا خراب نشوند، بیایید ببینیم چگونه می توانیم از Python به Base64 کدگذاری و رمزگشایی داده ها استفاده کنیم.

رمزگذاری رشته ها با پایتون

پایتون 3 یک را فراهم می کند base64 ماژولی که به ما امکان می دهد به راحتی اطلاعات را رمزگذاری و رمزگشایی کنیم. ابتدا رشته را به یک شی بایت مانند تبدیل می کنیم. پس از تبدیل، می توانیم از آن استفاده کنیم base64 ماژول برای رمزگذاری آن

در یک فایل جدید encoding_text.py، زیر را وارد کنید:

import base64

message = "Python is fun"
message_bytes = message.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')

print(base64_message)

در کد بالا، ابتدا کد را وارد کردیم base64 مدول. این message متغیر رشته ورودی ما را برای کدگذاری ذخیره می کند. ما آن را با استفاده از رشته به یک شی بایت مانند تبدیل می کنیم encode روش و ذخیره آن در message_bytes. سپس Base64 را رمزگذاری می کنیم message_bytes و نتیجه را در آن ذخیره کنید base64_bytes با استفاده از base64.b64encode روش. ما در نهایت با رمزگشایی، نمایش رشته ای از تبدیل Base64 را دریافت می کنیم base64_bytes به عنوان ASCII.

توجه داشته باشید: هنگام تبدیل از رشته به بایت و از بایت به رشته، حتماً از همان قالب رمزگذاری استفاده کنید. این از خراب شدن داده ها جلوگیری می کند.

اجرای این فایل خروجی زیر را ارائه می دهد:

$ python3 encoding_text.py
UHl0aG9uIGlzIGZ1bg==

حالا بیایید ببینیم چگونه می توانیم یک رشته Base64 را به نمایش خام آن رمزگشایی کنیم.

رمزگشایی رشته ها با پایتون

رمزگشایی یک رشته Base64 اساساً معکوس کدگذاری است process. رشته Base64 را به بایت هایی از داده های رمزگذاری نشده رمزگشایی می کنیم. سپس شی بایت مانند را به یک رشته تبدیل می کنیم.

در یک فایل جدید به نام decoding_text.py، کد زیر را بنویسید:

import base64

base64_message = 'UHl0aG9uIGlzIGZ1bg=='
base64_bytes = base64_message.encode('ascii')
message_bytes = base64.b64decode(base64_bytes)
message = message_bytes.decode('ascii')

print(message)

یک بار دیگر، ما نیاز داریم base64 ماژول وارد شد سپس پیام خود را در یک شی بایت مانند با کدگذاری می کنیم encode('ASCII'). با فراخوانی ادامه می دهیم base64.b64decode روش رمزگشایی base64_bytes به ما message_bytes متغیر. در نهایت رمزگشایی می کنیم message_bytes به یک شی رشته message، بنابراین قابل خواندن برای انسان می شود.

این فایل را اجرا کنید تا خروجی زیر را ببینید:

$ python3 decoding_text.py
Python is fun

اکنون که می توانیم داده های رشته ای را رمزگذاری و رمزگشایی کنیم، بیایید سعی کنیم داده های باینری را رمزگذاری کنیم.

رمزگذاری داده های باینری با پایتون

همانطور که قبلا ذکر کردیم، رمزگذاری Base64 در درجه اول برای نمایش داده های باینری به عنوان متن استفاده می شود. در پایتون، ما باید فایل باینری را بخوانیم و Base64 بایت های آن را رمزگذاری می کند تا بتوانیم رشته کدگذاری شده آن را تولید کنیم.

بیایید ببینیم چگونه می توانیم این تصویر را رمزگذاری کنیم:

لوگوی پایتون

یک فایل جدید ایجاد کنید encoding_binary.py و موارد زیر را اضافه کنید:

import base64

with open('logo.png', 'rb') as binary_file:
    binary_file_data = binary_file.read()
    base64_encoded_data = base64.b64encode(binary_file_data)
    base64_message = base64_encoded_data.decode('utf-8')

    print(base64_message)

بیایید به قطعه کد بالا برویم. ما فایل را با استفاده از open('my_image.png', 'rb'). توجه داشته باشید که چگونه از آن عبور کردیم 'rb' آرگومان همراه با مسیر فایل – این به پایتون می گوید که ما در حال خواندن یک فایل باینری هستیم. بدون استفاده از 'rb'، پایتون فرض می کند که در حال خواندن یک فایل متنی هستیم.

سپس از read() روشی برای دریافت تمام داده های موجود در فایل در binary_file_data متغیر. مشابه روش برخورد با رشته ها، Base64 بایت ها را با آن کدگذاری کردیم base64.b64encode و سپس استفاده کرد decode('utf-8') روی base64_encoded_data برای دریافت داده های کدگذاری شده Base64 با استفاده از کاراکترهای قابل خواندن توسط انسان.

اجرای کد خروجی مشابهی تولید می کند:

$ python3 encoding_binary.py
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokXLxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aSv92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiKMVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JٰVPS+6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbliTB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIaxsmHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8Br5eXCsT/w/EAAAAASUVORK5CYII=

بسته به خروجی شما ممکن است متفاوت باشد روی تصویری که برای رمزگذاری انتخاب کرده اید.

اکنون که می دانیم چگونه Bas64 داده های باینری را در پایتون رمزگذاری کنیم، بیایید حرکت کنیم روی به Base64 رمزگشایی داده های باینری.

رمزگشایی داده های باینری با پایتون

باینری رمزگشایی Base64 مشابه داده های متنی رمزگشایی Base64 است. تفاوت اصلی این است که پس از اینکه Base64 رشته را رمزگشایی کردیم، داده ها را به جای رشته به عنوان یک فایل باینری ذخیره می کنیم.

بیایید ببینیم که Base64 چگونه داده های باینری را در عمل با ایجاد یک فایل جدید به نام رمزگشایی می کند decoding_binary.py. کد زیر را در فایل پایتون تایپ کنید:

import base64

base64_img = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAA' \
            'LEwEAmpwYAAAB1klEQVQ4jY2TTUhUURTHf+fy/HrjhNEX2KRGiyIXg8xgSURuokX' \
            'LxFW0qDTaSQupkHirthK0qF0WQQQR0UCbwCQyw8KCiDbShEYLJQdmpsk3895p4aS' \
            'v92ass7pcfv/zP+fcc4U6kXKe2pTY3tjSUHjtnFgB0VqchC/SY8/293S23f+6VEj' \
            '9KKwCoPDNIJdmr598GOZNJKNWTic7tqb27WwNuuwGvVWrAit84fsmMzE1P1+1TiK' \
            'MVKvYUjdBvzPZXCwXzyhyWNBgVYkgrIow09VJMznpyebWE+Tdn9cEroBSc1JٰVPS+' \
            '6moh5Xyjj65vEgBxafGzWetTh+rr1eE/c/TMYg8hlAOvI6JP4KmwLgJ4qD0TIbli' \
            'TB+sunjkbeLekKsZ6Zc8V027aBRoBRHVoduDiSypmGFG7CrcBEyDHA0ZNfNphC0D' \
            '6amYa6ANw3YbWD4Pn3oIc+EdL36V3od0A+MaMAXmA8x2Zyn+IQeQeBDfRcUw3B+2' \
            'PxwZ/EdtTDpCPQLMh9TKx0k3pXipEVlknsf5KoNzGyOe1sz8nvYtTQT6yyvTjIax' \
            'smHGB9pFx4n3jIEfDePQvCIrnn0J4B/gA5J4XcRfu4JZuRAw3C51OtOjM3l2bMb8' \
            'Br5eXCsT/w/EAAAAASUVORK5CYII='

base64_img_bytes = base64_img.encode('utf-8')
with open('decoded_image.png', 'wb') as file_to_save:
    decoded_image_data = base64.decodebytes(base64_img_bytes)
    file_to_save.write(decoded_image_data)

در کد بالا، ابتدا داده های رشته Base64 خود را به یک شی بایت مانند تبدیل می کنیم که می تواند رمزگشایی شود. هنگامی که در base64 یک فایل باینری را رمزگشایی می کنید، شما باید نوع داده ای که در حال رمزگشایی است را بداند. به عنوان مثال، این داده فقط به عنوان یک فایل PNG معتبر است و نه یک فایل MP3 زیرا یک تصویر را رمزگذاری می کند.

پس از باز شدن فایل مقصد، Base64 داده ها را رمزگشایی می کنیم base64.decodebytes، روشی متفاوت از base64.b64decode که با رشته ها استفاده می شد. این روش باید برای رمزگشایی داده های باینری استفاده شود. در نهایت، داده های رمزگشایی شده را در یک فایل می نویسیم.

در همان دایرکتوری که اجرا کردید decoding_binary.py، اکنون یک مورد جدید را می بینید decoded_image.png فایلی که حاوی تصویر اصلی است که قبلاً کدگذاری شده است.

نتیجه

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

با پایتون می توانیم از base64 ماژول به Base64 رمزگذاری و رمزگشایی متن و داده های باینری.

از چه برنامه هایی برای رمزگذاری و رمزگشایی داده های Base64 استفاده می کنید؟

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-19 03:48:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید