الأساس 64
التعريف
[عدل]الأساس 64 طريقة ترميز لتحويل ترميز أسكي للحروف إلى ترميز على أساس 64 ثم استخدام الحرف المقابل له في ترميز 64 [انظر جدول 1 في الأسفل ]
يستخدم الترميز بالأساس 64 عندما تكون هناك حاجة لترميز البيانات الثنائية المنقولة والممثلة لبيانات نصية، من أجل التأكد أن البيانات لا تزال سليمة بعد عملية النقل.
هناك العديد من التطبيقات التي تستخدم الترميز بالأساس 64 مثل البريد الإلكتروني باستخدام معيار الإنترنت MIME وكذلك في تخزين البيانات المعقدة في الإكس إم إل.[1]
مبدأ العمل
[عدل]يتكون البايت من 8 بت، وفي حال أردنا تمثيل رقم من 0-63 ، فإنه يلزمنا فقط 6 بت، لأن 2 أس 6 = 64
وبالتالي سيكون هناك عدد فائض من البت، أي أن عدد الحروف بعد الترميز، يزيد عنها قبله. و يتطلب هذا النوع من الترميز أن يكون عدد الحروف في النص من مضاعفات رقم 3، من أجل أن نتمكن من تقسيمها إلى عدد من مضاعفات 6، وفي حال تعذر ذلك يضاف الحرف $ في النهاية فكلمة "Linux" تصبح بعد الترميز "TGludXg$".
[2]
الخطوات
[عدل]- يتم أولاً تمثيل أسكي كود للحروف بالترميز الثنائي و باستخدام 8 بت.
لو كان لدينا نص من ثلاثة حروف، فسكون لدينا 3*8 بت
- ثم يؤخذ هذا الترميز الثنائي كقطعة واحدة ويقسم إلى مجموعات من 6 بت.
في حالة تقسيم الترميز الثنائي لثلاثة حروف إلى مجموعات من 6 بت، فإن النتيجة 4 مجموعات.
- يتم حساب الرقم المقابل لها والذي يمثل الرقم التسلسلي للحرف بعد الترميز.
مثال
[عدل]إذا أردنا ترميز كلمة "SPY" فترميز أسكي المقابل لها هو 83-80-89 وبالترميز الثنائي باستخدام 8 بت (0101001101010 00001011001) أي أن لدينا سلسلة من 24 بت يمكن تقسيمها إلى مجموعات من 6بت، لنحصل على الأرقام (20-53-1-25) وبالعودة إلى الجدول في الأسفل تصبح الكلمة بعد الترميز (U1BZ).
جدول ترميز الأساس 64:
| Value | Char | Value | Char | Value | Char | Value | Char | |||
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A |
16 | Q |
32 | g |
48 | w
| |||
| 1 | B |
17 | R |
33 | h |
49 | x
| |||
| 2 | C |
18 | S |
34 | i |
50 | y
| |||
| 3 | D |
19 | T |
35 | j |
51 | z
| |||
| 4 | E |
20 | U |
36 | k |
52 | 0
| |||
| 5 | F |
21 | V |
37 | l |
53 | 1
| |||
| 6 | G |
22 | W |
38 | m |
54 | 2
| |||
| 7 | H |
23 | X |
39 | n |
55 | 3
| |||
| 8 | I |
24 | Y |
40 | o |
56 | 4
| |||
| 9 | J |
25 | Z |
41 | p |
57 | 5
| |||
| 10 | K |
26 | a |
42 | q |
58 | 6
| |||
| 11 | L |
27 | b |
43 | r |
59 | 7
| |||
| 12 | M |
28 | c |
44 | s |
60 | 8
| |||
| 13 | N |
29 | d |
45 | t |
61 | 9
| |||
| 14 | O |
30 | e |
46 | u |
62 | +
| |||
| 15 | P |
31 | f |
47 | v |
63 | /
|
التطبيقات
[عدل]
تطبيقات بارزة لتقنية Base64:
- صفحات الويب
- يُعد ترميز Base64 شائعًا على شبكة الإنترنت العالمية[3] حيث يُستخدم غالبًا لتضمين البيانات الثنائية مثل الصور الرقمية في النصوص مثل HTML وCSS.[4]
- مرفقات البريد الإلكتروني
- يُستخدم ترميز Base64 على نطاق واسع لإرسال مرفقات البريد الإلكتروني، وذلك لأن بروتوكول SMTP – في شكله الأصلي صُممت هذه الطريقة لنقل أحرف ASCII ذات 7 بتات فقط. يضمن ترميز المرفق باستخدام Base64 قبل الإرسال، ثم فك ترميزه عند الاستلام، أن تقوم خوادم SMTP القديمة بنقل الرسائل بشكل صحيح مع المعلومات الثنائية المرفقة.
- تضمين البيانات الثنائية في ملف نصي
- على سبيل المثال، لتضمين بيانات صورة في نص برمجي لتجنب الاعتماد على ملفات خارجية.
- تضمين البيانات الثنائية في XML
- لإدراج البيانات الثنائية في ملف XML، باستخدام صيغة مشابهة لـ
<data encoding="base64">...</data>على سبيل المثال favicons في ملفbookmarks.htmlالمصدر من Firefox .
- ملفات PDF
- لإدراج ملف PDF في صفحة HTML.
- العناصر المضمنة
- على الرغم من أن Base64 ليس جزءًا من المواصفات الرسمية لتنسيق SVG، إلا أن بعض برامج العرض يمكنها تفسيره عند استخدامه للعناصر المضمنة، مثل الصور النقطية داخل ملفات SVG.[5]
- منع تصادمات الفواصل
- لنقل وتخزين النصوص التي قد تتسبب بخلاف ذلك في حدوث تعارض في الفواصل.
- تنسيق تبادل بيانات LDAP
- لترميز سلاسل الأحرف في ملفات تنسيق تبادل بيانات LDAP.
- مخططات معرّفات الموارد الموحدة للبيانات
- يمكن استخدام نظام معرّف الموارد الموحد للبيانات (Data URI) مع ترميز Base64 لتمثيل محتويات الملفات. على سبيل المثال، يمكن تحديد صور الخلفية والخطوط في ملف نمط CSS كمعرّفات موارد موحدة
data:URIs)، بدلاً من توفيرها في ملفات منفصلة.
- استخدم لوحة الكتابة
- يُستخدم هذا الأسلوب لتخزين/نقل كميات صغيرة نسبيًا من البيانات الثنائية عبر وظيفة الحافظة النصية في الحاسوب، لا سيما في الحالات التي لا تستدعي حفظ المعلومات بشكل دائم، أو عندما يلزم إرسالها بسرعة بين مجموعة واسعة من البرامج المختلفة التي قد تكون غير متوافقة. ومن الأمثلة على ذلك تمثيل المفاتيح العامة لمستلمي العملات المشفرة كسلاسل نصية مشفرة بنظام Base64، والتي يمكن نسخها ولصقها بسهولة في برامج محافظ المستخدمين.
- دعم التحقق البشري
- غالبًا ما يتم تمثيل البيانات الثنائية التي يجب التحقق منها بسرعة من قبل البشر كآلية أمان، مثل مجموعات التحقق من الملفات أو بصمات المفاتيح، في Base64 لسهولة التحقق، وأحيانًا مع تنسيق إضافي، مثل فصل كل مجموعة من أربعة أحرف في تمثيل بصمة مفتاح PGP بمسافة.
- ترميز رمز الاستجابة السريعة
- يُخزَّن رمز الاستجابة السريعة (QR code) ، الذي يحتوي على بيانات ثنائية، أحيانًا بصيغة Base64، لأن قارئ رمز الاستجابة السريعة (QR code) أكثر قدرة على فك تشفير النص بدقة من البيانات الثنائية. كما أن بعض الأجهزة تحفظ النص من رمز الاستجابة السريعة (QR code) بسهولة أكبر من حفظ البيانات الثنائية التي قد تكون ضارة.
أمثلة
[عدل]لتبسيط الشرح، يستخدم المثال أدناه نصًا عاديًا للإدخال. مع أن هذا يُستخدم عمليًا، إلا أن الاستخدام الأكثر شيوعًا هو ترميز الصور والبيانات الأخرى التي لا يمكن تمثيلها عادةً بنص عادي، ثم تُعرض البيانات في صيغة نصية قابلة للطباعة.
بالنسبة لبيانات الإدخال:
Many hands make light work.
التمثيل النموذجي لـ Base64 هو:
TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu
التشفير عند عدم الحاجة إلى الحشو
[عدل]
كل تسلسل إدخال مكون من 6 بتات (والذي يمكنه ترميز 2 6 = يتم تمثيل كل 64 قيمة (M) بحرف من حروف أبجدية Base64. بالتالي، ينتج عن ترميز Base64 أربعة أحرف لكل ثلاثة بايتات مُدخلة. بافتراض أن الإدخال هو ASCII أو ما شابه، فإن بيانات البايت للأحرف الثلاثة الأولى 'M' و'a' و'n' هي القيم 77 و 97 و 110 والتي تُمثل في التمثيل الثنائي ذي 8 بتات بالقيم 01001101 و 01100001 و 01101110 . بدمج هذه التمثيلات وتقسيمها إلى مجموعات من 6 بتات، نحصل على:
010011 010110 000101 101110
والتي تشفر السلسلة TWFu (حسب ASCII أو ما شابه).
يوضح الجدول التالي كيفية ترميز المدخلات. على سبيل المثال، الحرف "M" له القيمة 77 (وفقًا لنظام ASCII وما شابه). أول 6 بتات من القيمة هي 010011 أو 19 عشريًا، والتي تُقابل الحرف "T" في نظام Base64، والذي له القيمة 84 (وفقًا لنظام ASCII وما شابه).
| مدخل (ASCII) |
حرف (ASCII) | م | أ | ن | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8 بت القيمة العشرية |
77 | 97 | 110 | ||||||||||||||||||||||
| النظام الست عشري قيمة |
4 | د | 6 | 1 | 6 | هـ | |||||||||||||||||||
| أجزاء | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | |
| مشفر (Base64) |
6 بت القيمة العشرية |
19 | 22 | 5 | 46 | ||||||||||||||||||||
| خطاب (أبجدية Base64) |
تي | دبليو | F | u | |||||||||||||||||||||
| بايت | 84 | 87 | 70 | 117 | |||||||||||||||||||||
التشفير باستخدام حرف حشو واحد
[عدل]إذا كان المدخل يتكون من عدد من البايتات يزيد بمقدار 2 عن مضاعفات العدد 3 (مثل 'M'، 'a')، فسيتم ترميز آخر بايتين (16 بت) في 3 أرقام Base64 (18 بت). أما البتّان الأقل أهمية في آخر كتلة من 6 بتات تحتوي على المحتوى، فيتم التعامل معهما على أنهما صفران أثناء الترميز، ويتم تجاهلهما أثناء فك الترميز (مع حرف الحشو = في النهاية).
.
| مدخل (ASCII) |
حرف (ASCII) | م | أ| colspan="8" rowspan="3" data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8 بت القيمة العشرية |
77 | 97 | ||||||||||||||||||||||
| النظام الست عشري قيمة |
4 | د | 6 | 1 | ||||||||||||||||||||
| أجزاء | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp | ||||||
| مشفر (Base64) |
6 بت القيمة العشرية |
19 | 22 | 4| colspan="6" data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | Padding | ||||||||||||||||||||
| خطاب (أبجدية Base64) |
تي | دبليو | هـ | = | ||||||||||||||||||||
| بايت | 84 | 87 | 69 | 61 | ||||||||||||||||||||
التشفير باستخدام حرفين إضافيين
[عدل]إذا كان المدخل يتكون من عدد من البايتات يزيد بمقدار واحد عن مضاعفات العدد 3 (مثل 'M')، فإن آخر 8 بتات تُمثَّل برقمين من نوع Base64 (12 بت). تُعامل البتات الأربعة الأقل أهمية من آخر كتلة 6 بتات حاملة للمحتوى على أنها أصفار عند التشفير، وتُهمل عند فك التشفير (مع حرفي الحشو = في النهاية).
| مدخل (ASCII) |
حرف (ASCII) | م| colspan="16" rowspan="3" data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8 بت القيمة العشرية |
77 | |||||||||||||||||||||||
| النظام الست عشري قيمة |
4 | د | ||||||||||||||||||||||
| أجزاء | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp| data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | قالب:Fsp | ||||||||||||
| مشفر (Base64) |
6 بت القيمة العشرية |
19 | 16 | colspan="6" data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | Padding| colspan="6" data-sort-value="" style="background: var(--background-color-interactive, #ececec); color: var(--color-base, inherit); vertical-align: middle; text-align: center; " class="table-na" | Padding | |||||||||||||||||||||
| خطاب (أبجدية Base64) |
تي | سؤال | = | = | ||||||||||||||||||||
| بايت | 84 | 81 | 61 | 61 | ||||||||||||||||||||
فك التشفير مع الحشو
[عدل]عند فك التشفير، يتم تحويل كل سلسلة من أربعة أحرف مشفرة إلى ثلاثة بايتات ناتجة، ولكن مع حرف حشو واحد، يتم فك تشفير الأحرف الأربعة الأخيرة إلى بايتين فقط، أو مع حرفي حشو، يتم فك تشفير الأحرف الأربعة الأخيرة إلى بايت واحد. على سبيل المثال:
| مشفر | حشوة | طول | تم فك الشفرة |
|---|---|---|---|
==
|
1 | w | |
=
|
2 | wo | |
| style="background:#ececec;vertical-align:middle;text-align:center;" |None | 3 | wor الخفيف |
هناك طريقة أخرى لتفسير حرف الحشو، وهي اعتباره بمثابة تعليمات لحذف بتين من نهاية سلسلة البتات في كل مرة يُصادف فيها رمز يساوي ( = . على سبيل المثال، عندما عند فك تشفير، نحول كل حرف (باستثناء علامات المساواة اللاحقة = إلى تمثيله المقابل المكون من 6 بتات، ثم نتجاهل بتين لاحقتين لكل علامة مساواة = وبتين لاحقتين لكل علامة مساواة أخرى. في هذه الحالة، نحصل على 6 بتات من = d و6 بتات أخرى من w لسلسلة بتات طولها 12، ولكن بما أننا نحذف بتين لكل = مساواة (ليصبح المجموع 4 بتات)، فإن dw== ينتج في النهاية 8 بتات (بايت واحد) عند فك تشفيره.
فك التشفير بدون حشو
[عدل]لا يُعدّ استخدام حرف الحشو في النص المُشفّر ضروريًا لفك التشفير. يُمكن استنتاج عدد البايتات المفقودة من طول النص المُشفّر. في بعض الصيغ، يكون حرف الحشو إلزاميًا، بينما لا يُستخدم في صيغ أخرى. والجدير بالذكر أنه عند دمج سلاسل Base64 المُشفّرة، يصبح استخدام أحرف الحشو ضروريًا.
بدون إضافة حشو، بعد فك تشفير كل سلسلة من 4 أحرف مشفرة، قد يتبقى حرفان أو ثلاثة أحرف مشفرة. من المستحيل وجود حرف مشفر واحد متبقٍ لأن حرف Base64 الواحد يحتوي على 6 بتات فقط، بينما يتطلب إنشاء بايت 8 بتات. يساهم الحرف الأول بـ 6 بتات، ويساهم الحرف الثاني بأول بتين منه. يوضح الجدول التالي فك تشفير السلاسل المشفرة التي تحتوي على حرفين أو ثلاثة أحرف متبقية أو لا تحتوي على أي أحرف متبقية.
| مشفر | طول من المجموعة الأخيرة |
تم فك الشفرة | الطول بعد فك التشفير من المجموعة الأخيرة |
|---|---|---|---|
| 2 | w | 1 | |
| 3 | wo | 2 | |
| 4 | wor الخفيف | 3 |
لا يتم تنفيذ عملية فك التشفير بدون إضافة حشو بشكل متسق بين أجهزة فك التشفير. بالإضافة إلى ذلك، فإن السماح بفك التشفير بدون استخدام لوحة مفاتيح يسمح، بحكم التعريف، بفك تشفير سلاسل نصية متعددة إلى نفس مجموعة البايتات، وهو ما قد يشكل خطراً أمنياً.[6]
الطرازات
[عدل]تختلف صيغ Base64 في الأبجدية المستخدمة والجوانب البنيوية مثل الحد الأقصى لطول السطر. الأبجدية الأكثر شيوعًا هي تلك الموصوفة في RFC 4648، ومعظم الصيغ لا تختلف إلا في الحرفين الأخيرين. يوضح الجدول التالي أكثر الترميزات شيوعًا والمحددة في RFC.
| التشفير | مواصفة | الأبجدية | خطوط | ||||
|---|---|---|---|---|---|---|---|
| الفرقة 62 | 63 | وسادة | الفواصل | طول | مجموع التحقق | ||
| ترميز Base 64 | RFC 4648 §4 | +
|
/
|
= |
لا | لا | |
| ترميز Base64 مع أبجدية آمنة لعناوين URL وأسماء الملفات | RFC 4648 §5 | -
|
_
|
=خياري |
لا | لا | |
| لـ MIME | RFC 2045 | +
|
/
|
= |
نعم | 76 | لا |
| للبريد المحسن للخصوصية (مهمل) | RFC 1421 | +
|
/
|
= |
نعم | 64 | نعم, in PEM CRC |
| لترميز UTF-7 | RFC 2152 | +
|
/
|
لا | لا | ||
| لأسماء صناديق بريد IMAP | RFC 3501 | +
|
,
|
لا | لا | ||
| التشفيرات النصية لهياكل PKIX وPKCS وCMS | RFC 7468 | +
|
/
|
= |
نعم | 64 | لا |
| درع ASCII لـ OpenPGP | RFC 9580 | +
|
/
|
= |
نعم | 76 | نعم, (CRC24) |
RFC 4648
[عدل]تحدد وثيقة RFC أيضًا ترميز Base64 ثانيًا يُسمى "ترميز Base64 مع أبجدية آمنة لعناوين URL وأسماء الملفات"، وهو مُصمم لتمثيل معلومات تعريفية طويلة نسبيًا. على سبيل المثال، قد يستخدم إطار عمل استمرارية قاعدة البيانات لكائنات Java ترميز Base64 لترميز مُعرّف فريد كبير نسبيًا (عادةً ما يكون UUID بطول 128 بت) كسلسلة نصية لاستخدامها كمعامل HTTP في نموذج HTTP أو عنوان URL لطلب HTTP GET. كذلك، تحتاج العديد من التطبيقات إلى ترميز البيانات الثنائية بطريقة تُسهّل تضمينها في عنوان URL، بما في ذلك حقول نماذج الويب المخفية، ويُعد Base64 ترميزًا مناسبًا لعرضها بشكل مُختصر.
يتطلب استخدام Base64 القياسي في عنوان URL ترميز الأحرف + و / و = كسلاسل سداسية عشرية خاصة مُرمّزة بنسبة مئوية ( + تصبح %2B ، / تصبح %2F، و = تصبح %3D )، مما يجعل السلسلة أطول وأصعب في القراءة. يسمح استخدام أبجدية مختلفة بالترميز باستخدام Base64 دون الحاجة إلى هذه العلامات الإضافية. عادةً، يتم استبدال + و / بـ - _ على التوالي، بحيث لا يكون استخدام مُرمّزات/مُفكّكات عناوين URL ضروريًا ولا يؤثر على طول القيمة المُرمّزة، مما يُبقي نفس الشكل المُرمّز سليمًا للاستخدام في قواعد البيانات العلائقية، ونماذج الويب، ومعرّفات الكائنات بشكل عام. يُعد YouTube موقعًا شائعًا للاستفادة من ذلك.[7] تسمح بعض المتغيرات أو تتطلب حذف علامات الحشو = لتجنب الخلط بينها وبين فواصل الحقول، أو تتطلب أن يكون أي حشو من هذا القبيل مُرمّزًا بنسبة مئوية. بعض المكتبات encode = as، مما قد يعرض التطبيقات لهجمات المسار النسبي عندما يتم ترميز اسم المجلد من بيانات المستخدم.[ مطلوب مصدر ]
RFC 3548
[عدل]ما لم تتم كتابة برنامج التشفير وفقًا لمواصفات تشير إلى ويشترط خلاف ذلك على وجه التحديد ، يحظر RFC 3548 على المُشفِّر إنشاء رسائل تحتوي على أحرف خارج أبجدية التشفير أو بدون حشو، كما ينص على أنه يجب على المُفكِّك رفض البيانات التي تحتوي على أحرف أخرى غير أبجدية التشفير.[8]
MIME
[عدل]تُدرج مواصفات MIME (ملحقات البريد الإلكتروني متعددة الأغراض للإنترنت) ترميز Base64 كأحد نظامي ترميز ثنائي إلى نص (الآخر هو quoted-printable ). يعتمد ترميز Base64 الخاص بـ MIME على ترميز... إصدار من PEM: يستخدم نفس الأبجدية المكونة من 64 حرفًا وآلية التشفير المستخدمة في PEM، ويستخدم رمز = لحشو الإخراج بنفس الطريقة، كما هو موضح في.
لا يحدد معيار MIME طولًا ثابتًا للأسطر المشفرة بنظام Base64، ولكنه يحدد حدًا أقصى لطول السطر يبلغ 76 حرفًا. بالإضافة إلى ذلك، ينص على أنه يجب تجاهل أي حرف خارج المجموعة القياسية المكونة من 64 حرفًا للتشفير (على سبيل المثال، تسلسلات CRLF) بواسطة برنامج فك التشفير المتوافق، على الرغم من أن معظم التطبيقات تستخدم زوج سطر جديد CR/LF لفصل الأسطر المشفرة.
وبالتالي، فإن الطول الفعلي للبيانات الثنائية المشفرة بنظام Base64 والمتوافقة مع معيار MIME يبلغ عادةً حوالي 137% من طول البيانات الأصلية ( × مع العلم أنه بالنسبة للرسائل القصيرة جدًا، قد يكون الحمل الزائد أعلى بكثير بسبب الحمل الزائد للرؤوس. تقريبًا، يساوي الحجم النهائي للبيانات الثنائية المشفرة بنظام Base64 1.37 ضعف حجم البيانات الأصلية + 814 بايت (للرؤوس). يمكن تقريب حجم البيانات التي تم فك تشفيرها باستخدام هذه الصيغة:
bytes = (string_length(encoded_string) − 814) / 1.37
البريد الإلكتروني المعزز للخصوصية
[عدل]كان أول استخدام موحد معروف للترميز الذي يُطلق عليه الآن اسم MIME Base64 في بروتوكول البريد المحسن للخصوصية (PEM)، الذي اقترحه في عام 1987. يحدد PEM مخطط "الترميز القابل للطباعة" الذي يستخدم ترميز Base64 لتحويل سلسلة عشوائية من البايتات إلى تنسيق يمكن التعبير عنه في أسطر قصيرة من الأحرف ذات 6 بت، كما هو مطلوب بواسطة بروتوكولات النقل مثل SMTP.[9]
الإصدار الحالي من PEM (المحدد في يستخدم ) أبجدية مكونة من 64 حرفًا، تشمل الأحرف اللاتينية الكبيرة والصغيرة ( A إلى Z ، a إلى z )، والأرقام ( 0 إلى 9 )، ورمزي + و / . كما يُستخدم رمز = كلاحقة حشو. [10] المواصفات الأصلية، ، بالإضافة إلى ذلك استخدم الرمز * لتحديد البيانات المشفرة ولكن غير المشفرة داخل دفق الإخراج.
لتحويل البيانات إلى ترميز PEM القابل للطباعة، يُوضع البايت الأول في البتات الثمانية الأكثر أهمية من مخزن مؤقت ذي 24 بت، والبايت التالي في البتات الثمانية الوسطى، والبايت الثالث في البتات الثمانية الأقل أهمية . إذا تبقى أقل من ثلاثة بايتات للترميز (أو أقل من ثلاثة بايتات إجمالاً)، تُصبح البتات المتبقية في المخزن المؤقت أصفارًا. ثم يُستخدم المخزن المؤقت، ستة بتات في كل مرة، بدءًا بالبتات الأكثر أهمية، كمؤشرات في السلسلة: " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ "، ويُخرج الحرف المُشار إليه.
تُكرر هذه العملية على البيانات المتبقية حتى يتبقى أقل من أربعة بايتات. إذا تبقى ثلاثة بايتات، تُعالج البيانات بشكل طبيعي. أما إذا تبقى أقل من ثلاثة بايتات (24 بت) للترميز، تُضاف أصفار إلى يمين البيانات المدخلة لتكوين مضاعف صحيح للعدد ستة بتات.
بعد ترميز البيانات غير المُضافة، إذا كان بايتان من المخزن المؤقت ذي الـ 24 بت مُضافين إليهما أصفار، يُضاف رمزان = إلى الناتج؛ أما إذا كان بايت واحد من المخزن المؤقت ذي الـ 24 بت مُضافًا إليه أصفار، فيُضاف رمز = واحد. يُشير هذا إلى وحدة فك الترميز بضرورة استبعاد بتات الأصفار المُضافة نتيجةً للإضافة من البيانات المُعاد بناؤها. كما يضمن هذا أن يكون طول الناتج المُرمّز من مضاعفات 4 بايت.
يشترط تنسيق PEM أن تتكون جميع الأسطر المشفرة من 64 حرفًا قابلاً للطباعة بالضبط، باستثناء السطر الأخير الذي قد يحتوي على عدد أقل من الأحرف القابلة للطباعة. وتُفصل الأسطر بمسافات بيضاء وفقًا للاتفاقيات المحلية (الخاصة بالمنصة).
UTF-7
[عدل]جرى تقديم نظام يُسمى Base64 المُعدَّل. يُستخدم نظام ترميز البيانات هذا لترميز UTF-16 كأحرف ASCII لاستخدامها في بروتوكولات نقل البيانات ذات 7 بتات مثل SMTP. وهو نوع مُعدَّل من ترميز Base64 المُستخدم في MIME.[11][11]
تتكون أبجدية "Base64 المعدلة" من أبجدية MIME Base64، ولكنها لا تستخدم حرف الحشو " = ". يُستخدم ترميز UTF-7 في رؤوس البريد الإلكتروني (المحددة في )، ويُحفظ رمز " = " في هذا السياق كرمز هروب لترميز "quoted-printable". ببساطة، يحذف Base64 المُعدَّل الحشو وينتهي مباشرةً بعد آخر رقم Base64 يحتوي على بتات مفيدة، تاركًا ما يصل إلى ثلاثة بتات غير مستخدمة في آخر رقم Base64.
OpenPGP
[عدل]OpenPGP، الموصوف في يحدد المعيار ترميز " ASCII armor "، وهو مطابق لترميز "Base64" الموصوف في MIME، مع إضافة CRC اختياري بطول 24 بت. يتم حساب مجموع التحقق على بيانات الإدخال قبل الترميز؛ ثم يتم ترميز مجموع التحقق باستخدام خوارزمية Base64 نفسها، ويُضاف إلى بيانات الإخراج المُرمّزة مسبوقًا بالرمز " = " كفاصل.[12]
جافا سكريبت (واجهة برمجة تطبيقات الويب DOM)
[عدل]تُوفّر دالتا atob() و btoa() في جافا سكريبت، المُعرّفتان في مسودة مواصفات HTML5،[13][14] وظائف ترميز وفك ترميز Base64 لصفحات الويب. تُخرج دالة btoa() أحرفًا حشوية، ولكن هذه الأحرف اختيارية في مُدخلات دالة atob(). مثال: ترميز بداية ملف GIF: btoa("GIF89a") ↦ "R0lGODlh" .
بترتيب أبجدي غير نمطي
[عدل]تستخدم العديد من المتغيرات أبجديات مشابهة للمتغيرات الشائعة، ولكن بترتيب مختلف.
- كلمة مرور يونكس
- يخزن نظام يونكس تجزئات كلمات المرور المحسوبة باستخدام <b id="mwBAg">أداة التشفير (crypt)</b> في الملف <code id="mwBAo">/etc/passwd</code> باستخدام ترميز يُسمى B64 . تضع أداة التشفير علامات الترقيم (
.و/قبل الأحرف الأبجدية الرقمية. تستخدم أداة التشفير الترميز "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" بدون إضافة أحرف بادئة. ومن مزاياها مقارنةً بـ RFC 4648 أن فرز بيانات ASCII المشفرة ينتج عنه نفس ترتيب فرز بيانات ASCII الأصلية.
- GEDCOM
- يستخدم معيار GEDCOM 5.5 لتبادل بيانات الأنساب ترميز ملفات الوسائط المتعددة بتنسيق ملف هرمي يعتمد على أسطر النص. يستخدم GEDCOM نفس الأبجدية المستخدمة في التشفير، وهي "
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" . [15]
- bcrypt
- صُممت تجزئات bcrypt لتُستخدم بنفس طريقة تجزئات crypt(3) التقليدية، ولكن ترتيب حروف bcrypt يختلف عن ترتيب حروف crypt. يستخدم bcrypt الأبجدية "
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" . [16]
- Xxencoding
- يستخدم Xxencoding مجموعة أحرف أبجدية رقمية في الغالب تشبه crypt، ولكن باستخدام
+و-بدلاً من.و/. يستخدم Xxencoding الأبجدية "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .
- عبوة من 6 قطع
- يستخدم مع بعض وحدات التحكم في العقد الطرفية، ويستخدم أبجدية من 0x00 إلى 0x3f.[17]
- سحق
- يدعم Bash القيم العددية الحرفية في Base64. يستخدم Bash الأبجدية "
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@_" .[18]
تستخدم بعض المتغيرات أبجدية Base64 تختلف اختلافًا كبيرًا عن الأبجديات المستخدمة في أكثر متغيرات Base64 شيوعًا (مثل RFC 4648).
- Uuencoding
- لا تتضمن أبجدية Uuencoding أحرفًا صغيرة، بل تستخدم رموز ASCII 32 ("
من " (مسافة)) إلى 95 ("_"), على التوالي. يستخدم ترميز Uuencoding الأبجدية "!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" . كان تجنب استخدام الأحرف الصغيرة مفيدًا، لأن العديد من الطابعات القديمة كانت تطبع الأحرف الكبيرة فقط. ساهم استخدام أحرف ASCII المتتالية في توفير طاقة المعالجة، لأنه كان من الضروري فقط إضافة 32، دون الحاجة إلى جدول بحث. قد يحد استخدام معظم علامات الترقيم وحرف المسافة من فائدته في بعض التطبيقات، مثل تلك التي تستخدم هذه الأحرف كجزء من بناء الجملة.[ مطلوب مصدر ]
- BinHex
- يستثني <b id="mwBFU">نظام BinHex 4</b> (HQX)، الذي كان يُستخدم في نظام التشغيل Mac OS الكلاسيكي ، بعض الأحرف التي قد تُسبب التباسًا بصريًا مثل '
7' و'O' و'g' و'o'. وتتضمن أبجديته علامات ترقيم إضافية، حيث يستخدم الأبجدية "!"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr" .
- UTF-8
- يمكن لبيئة UTF-8 استخدام بايتات الاستمرار غير المتزامنة كـ base64:
0b10 xxxxxx. انظر UTF-8#التزامن الذاتي.
انظر أيضا
[عدل]- 8BITMIME – نقل البيانات بـ 8 بت لبروتوكول SMTP
- Base16 – ترميز لتسلسل من قيم البايت باستخدام النظام الست عشري
- Binary number – نظام عد ذو رقم أساس 2
المصادر
[عدل]- ^ Base64 - Wikipedia, the free encyclopedia "نسخة مؤرشفة". مؤرشف من الأصل في 2019-05-30. اطلع عليه بتاريخ 2019-05-31.
{{استشهاد ويب}}: صيانة الاستشهاد: BOT: original URL status unknown (link) - ^ Yu, Lili, Wang Zhijuan, and Wang, Weifeng. 2012. The Application of Hybrid Encryption Algorithm in Software Security. page 2
- ^ "Base64 encoding and decoding – Web APIs". MDN Web Docs. مؤرشف من الأصل في 2014-11-11.
- ^ "When to base64 encode images (and when not to)". 28 أغسطس 2011. مؤرشف من الأصل في 2023-08-29.
- ^ "Edit fiddle". jsfiddle.net. مؤرشف من الأصل في 2026-02-26.
- ^ Chalkias، Konstantinos؛ Chatzigiannis، Panagiotis (30 مايو 2022). "Base64 Malleability in Practice" (PDF). ASIA CCS '22: 2022 ACM on Asia Conference on Computer and Communications Security. ص. 1219–1221. DOI:10.1145/3488932.3527284. مؤرشف من الأصل (PDF) في 2026-03-12.
- ^ "Here's Why YouTube Will Practically Never Run Out of Unique Video IDs". www.mentalfloss.com (بالإنجليزية). 23 Mar 2016. Retrieved 2021-12-27.
- ^ The Base16, Base32, and Base64 Data Encodings.
- ^ Privacy Enhancement for Internet Electronic Mail. DOI:10.17487/RFC0989. RFC 989.
- ^ Privacy Enhancement for InternetElectronic Mail: Part I: Message Encryption and Authentication Procedures. DOI:10.17487/RFC1421. RFC 1421.
- ^ ا ب UTF-7 A Mail-Safe Transformation Format of Unicode.
- ^ OpenPGP Message Format.
- ^ "7.3. Base64 utility methods". HTML 5.2 Editor's Draft. رابطة الشبكة العالمية. مؤرشف من الأصل في 2019-06-13. اطلع عليه بتاريخ 2018-01-02. Introduced by changeset 5814 نسخة محفوظة 2014-02-22 على موقع واي باك مشين., 2021-02-01.
- ^ "Window: btoa() method". 24 يونيو 2025. مؤرشف من الأصل في 2026-04-01. اطلع عليه بتاريخ 2025-07-31.
- ^ "The GEDCOM Standard Release 5.5". Homepages.rootsweb.ancestry.com. مؤرشف من الأصل في 2020-09-30. اطلع عليه بتاريخ 2012-06-21.
- ^ Provos، Niels (13 فبراير 1997). "src/lib/libc/crypt/bcrypt.c r1.1". مؤرشف من الأصل في 2026-02-17. اطلع عليه بتاريخ 2018-05-18.
- ^ "6PACK a "real time" PC to TNC protocol". مؤرشف من الأصل في 2012-02-24. اطلع عليه بتاريخ 2013-05-19.
- ^ "Shell Arithmetic". Bash Reference Manual. مؤرشف من الأصل في 2026-03-02. اطلع عليه بتاريخ 2020-04-08.
Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.