متوفر أيضًا بلغات أخرى: English · Español · Português · Français
ترميز base32 وفكّ ترميزه
من النص إلى base32 وبالعكس، بأبجديتَي RFC 4648، وقواعدِ حشوٍ حقيقية، وتنبيهٍ حين لا يكون الترميزُ قياسيًّا.
ما base32؟
base32 يمثّل بايتاتٍ كيفما كانت باثنين وثلاثين محرفًا قابلًا للطباعة، حتى تستطيع بياناتٌ ليست نصًّا أن تعبر أماكن لا تقبل إلا النص. وهو معرَّفٌ في RFC 4648، وهي المواصفةُ نفسُها التي تعرّف base64 وbase16، ويعمل بكمّاتٍ من خمسة بايتات: أربعون بتًّا تُقسَم ثمانيةَ مجاميعَ من خمسة، ويصير كلُّ مجموعٍ محرفًا.
والسؤالُ البديهي: لِمَ يستعمله أحدٌ وbase64 موجودٌ وأصغر؟ إن base32 يكلّف ثمانيةَ محارف لكل خمسة بايتات، مقابل أربعةٍ لكل ثلاثة في base64: نسبةُ 8/5 مقابل 4/3، فيصير base32 أكبر بمقدار 6/5 بالضبط، أي عشرين في المئة. وتُدفع هذه العشرون في المئة لخاصّةٍ واحدة: الأبجديةُ لا تفرّق بين الكبير والصغير من الحروف. فـbase64 يحتاج الحالتين ليبلغ أربعةً وستين محرفًا، فكلُّ ما يوحّد الحالة يهدمه. أما base32 فلا يستعمل إلا ستةً وعشرين حرفًا وستةَ أرقام، فينجو من أنظمة الملفات التي تهمل الحالة، ومن وسوم DNS، وأسماء المضيفات، ومن أن يُقرأ جهرًا أو يُنقل باليد.
وتلك هي المقايضةُ كلُّها، وهي تفسّر أين يظهر base32 فعلًا: في سجلات DNSSEC، وفي روابط المغناطيس في شبكات التشارك، وفي الأسرار المشتركة التي تحفظها تطبيقاتُ التحقق بعاملين، حيث يضطر إنسانٌ أحيانًا إلى كتابة الشيء بيده.
كيف تستعمله؟
- اختر الترميز أو فكّ الترميز، ثم اختر أبجدية. والمعياريةُ هي التي تريدها ما لم تعلم خلاف ذلك. والست عشريةُ الموسَّعة هي الأبجديةُ الأخرى التي يعرّفها RFC 4648، والقسمُ أدناه يبيّن متى تكون هي الصواب.
- ألصق نصَّك أو الـbase32 في الصندوق. وعند الترميز يعرض لك عددَ البايتات الداخلة والمحارفِ الخارجة ونسبةَ التمدّد. وعند فكّ الترميز يتسامح مع المسافات ومع الحروف الصغيرة، إذ لا تحمل واحدةٌ منهما معنًى هنا.
- انسخ الناتج. وعند الترميز تستطيع إطفاء حشو علامات التساوي في الآخر، فالمواصفاتُ الحقيقية تطفئه. وإن ألصقت شيئًا ليس ترميزًا قياسيًّا فكّه لك على كل حال وأخبرك، بدل أن يتظاهر بأن المُدخَل كان سليمًا.
أبجديتان، والتي لا ينفّذها أحدٌ هي التي تترتّب
يعرّف RFC 4648 الـbase32 مرتين. فالقسمُ السادس يعطي الأبجديةَ المعروفة: من A إلى Z ثم الأرقامَ من 2 إلى 7. والقسمُ السابع يعطي ثانيةً يسمّيها الست عشريةَ الموسَّعة: الأرقامَ من 0 إلى 9 ثم من A إلى V. ولا تكاد تنفيذةٌ تعرض غير الأولى، وسببُ وجود الثانية دقيقٌ لا زخرفي.
فالأبجديةُ الست عشريةُ الموسَّعة على ترتيب ASCII تصاعدًا. تمضي القيمُ من 0 إلى 9 ثم من A إلى V، وهو الترتيبُ الذي تترتّب به تلك المحارفُ أصلًا، فتترتّب السلسلةُ المرمَّزة كما تترتّب البايتاتُ تحتها تمامًا. وأما الأبجديةُ المعيارية فليست على ترتيب ASCII: إذ تسنِد القيمةَ 0 إلى الحرف A وهو 0x41، والقيمةَ 26 إلى الرقم 2 وهو 0x32. فتترتّب القيمُ الستُّ الأخيرة قبل الستِّ والعشرين الأولى، وينكسر الترتيب.
وهذه دعوى الأولى بها أن تُقاس لا أن تُسلَّم، ولذلك تقيسها الاختبارات. فعلى عشرين ألف زوجٍ مولَّدٍ من سلاسل بايتاتٍ متساويةِ الطول، تحفظ الست عشريةُ الموسَّعة ترتيبَ كل زوجٍ منها بلا استثناء. وتحفظه المعياريةُ في أربعةٍ وسبعين في المئة من المرات، أي أنها تبدو عاملةً في الغالب وتخذل في الموضع الذي تحتاجها فيه بالضبط.
ولهذه الخاصّة مستهلكٌ حقيقي، وهو خيرُ تأكيدٍ ممكن. فسجلاتُ NSEC3 في DNSSEC، المعرَّفةُ في RFC 5155، تخزّن أسماءَ المالكين ملبَّدةً بـbase32 بالأبجدية الست عشرية الموسَّعة، والمواصفةُ تقول السببَ بلفظها: إن ذلك الترتيب هو نفسُه الترتيبُ القياسي لأسماء DNS حين تُرمَّز الأسماءُ هكذا. وNSEC3 يعمل بإثبات أن لا اسم يقع في الفجوة بين جارين، فالترتيبُ هناك ليس تيسيرًا بل هو الآلية. ثم إن RFC 5155 يستغني عن الحشو بالكلية، ولذلك تدعك هذه الأداةُ تطفئه.
والثمنُ بصريّ، وهو أدقُّ مما يبدو أولَ وهلة. فالأبجديةُ المعيارية لا تتجنّب المحارفَ الملتبسةَ الشكل وحسب: بل تُبقي الحرفين O وI وهما الملتبسان عينًا. وإنما تتجنّب الأزواجَ الملتبسة، لأن الرقمين 0 و1 ليسا في الأبجدية، فلا يكون الـO إلا حرفًا ولا يظهر الـ1 قط، فيمتنع سوءُ القراءة. أما الست عشريةُ الموسَّعة ففيها 0 و1 وO وI معًا، وذلك الالتباسُ الحقيقي هو ما تدفعه ثمنًا لأن تترتّب.
الحشو، وثلاثةُ أطوالٍ لا يمكن أن توجد
قواعدُ الحشو في base32 أشدُّ من قواعد base64 والخطأُ فيها أكثر. فلمّا كانت ثمانيةُ محارف تحمل خمسةَ بايتات، كان المجموعُ الأخير الناقص يترك جسمًا من 2 أو 4 أو 5 أو 7 محارف، يُحشى إلى ثمانيةٍ بستٍّ أو أربعٍ أو ثلاثٍ أو واحدةٍ من علامات التساوي على الترتيب. وهذه الأربعةُ ليست عرفًا بل حساب، والمفكِّكُ الذي يقبل غيرها إنما يقبل شيئًا لم يُخرجه مرمِّز.
والنتيجةُ الأمضى أن ثلاثةَ أطوالٍ مستحيلة. فجسمُ الـbase32 لا يزيد أبدًا على مضاعفٍ للثمانية بمقدار 1 أو 3 أو 6 محارف، إذ ليس ثمة عددُ بايتاتٍ داخلةٍ يُنتجها. قابل هذا بـbase64، حيث طولٌ واحدٌ من أربعةٍ فقط مستحيل. فسلسلةُ base32 ذاتُ الطول الخاطئ ليست قصيرةً ولا مبتورةً فحسب: بل هي برهانٌ على أن شيئًا في الأعلى معطوب، وهذه الأداةُ تقول ذلك بدل أن تحزر المقصود.
والحشوُ نفسُه اختياريٌّ عمليًّا. فأمثلةُ المواصفة نفسِها تدرجه، وDNSSEC يُسقطه صراحةً، وأسرارُ تطبيقات التحقق تُكتب عادةً بغيره. وهذه الأداةُ تقبل المُدخَل على الوجهين وتدعك تختار عند الترميز، لأن كليهما مشروع، وأداةٌ تصرّ على واحدٍ تكون مخطئةً في نصف الدنيا.
حين يكون للبايتات نفسِها هجاءاتٌ عدّة
القسمُ 3.5 من RFC 4648 عنوانُه الترميزُ القياسي، وهو يصف مشكلةً تتجاهلها أكثرُ الأدوات. فحين يكون المجموعُ الأخير ناقصًا، يحمل المحرفُ الأخير بعضَ بتّاتٍ من بياناتٍ حقيقية وبعضَ بتّاتٍ فائضة. وتقول المواصفةُ إن على المرمِّز المطابق أن يصفّر تلك الفائضة، وتحذّر من أنه إن لم يفعل فلا وجود لتمثيلٍ قياسي، وسلاسلُ مختلفةٌ عدّة تفكّ إلى البيانات الثنائية نفسِها.
وعددُ الهجاءات يحدّده الحساب. فجسمٌ ينتهي بمحرفين فيه بتّان حرّان، فأربعُ سلاسل مختلفة تفكّ إلى البايت نفسِه؛ وجسمٌ من أربعة محارف فيه أربعةُ بتّاتٍ حرّةٍ وستةَ عشرَ هجاءً؛ ومن خمسةٍ فيه بتٌّ واحدٌ واثنان؛ ومن سبعةٍ فيه ثلاثةُ بتّاتٍ وثمانية. وعلى التعيين: الحرفُ المفرد f يُرمَّز MY، وMZ وM2 وM3 تفكّ إلى f كذلك.
والمواصفةُ لا تقول إلا أن للمفكِّك أن يرفض ذلك المُدخَل، ولأنها «له أن»، فلا يكاد شيءٌ يفعل. ومكتبةُ بايثون القياسية مثالٌ معقولٌ على تنفيذٍ متأنٍّ، وقد قبلت ألفين من ألفي سلسلةٍ حُوِّرت عمدًا، وأعادت البايتات الأصلية في كل واحدةٍ منها بلا كلمة. وذلك سلوكٌ مطابق، وهو أيضًا الطريقةُ التي تنتهي بها بياناتٌ واحدة إلى تمثيلاتٍ عدّةٍ داخل أنظمةٍ افترضت أن لها تمثيلًا واحدًا.
وهذه الأداةُ تختار الطريق الثالث. تفكّ المُدخَل غيرَ القياسي، لأن الرفض قليلُ النفع ويخبرك أقل، ثم تقول إن الترميز لم يكن قياسيًّا وتريك ما كان سيكتبه مرمِّزٌ مطابق. فإن كنت تقارن سلاسل base32 بالتساوي في موضعٍ ما، مفاتيحَ خبيئةٍ أو معرِّفاتٍ أو إسقاطًا للمكرَّر، فذلك الفرقُ هو عينُ العلّة التي تبحث عنها.
حدودٌ صادقة
هذه ترمّز نصًّا وتفكّه، لا ملفات. فالمُدخَل يُعامَل نصًّا ويُحوَّل إلى بايتات UTF-8 قبل الترميز، وفي العودة يجب أن تكون البايتاتُ UTF-8 صحيحًا وإلا قالت الأداةُ ذلك بدل أن تناولك محارفَ استبدال. ومعنى هذا الفحص الأخير أنك لا تستطيع أن تمرّر بهذه الصفحة ثنائيًّا كيفما كان في اتجاه الفكّ، وذلك متعمَّد: إفسادُ البايتات صمتًا أسوأُ من ردّها.
و base32 ترميزٌ لا تشفير. لا يخفي شيئًا. فمن عرف طقمَ المحارف فكّه في ثوانٍ، وكونُ السلسلة تبدو مبهمةً ليس حمايةً من أيّ نوع. وإن أردت نصًّا لا يقرأه غيرُك فأنت تريد التشفير، وله صفحةٌ أخرى في هذا الموقع.
وأخيرًا فالأبجديتان هنا هما اللتان يعرّفهما RFC 4648. وثمة صيغٌ أخرى للـbase32 في الدنيا، منها صيغةُ كروكفورد التي تحذف حروفًا وتدمج أخرى، وz-base-32 التي تعيد ترتيب الأبجدية لأجل الناس، وليست متبادلةَ التشغيل لا مع هاتين ولا بعضُها مع بعض. فإن أبت سلسلةٌ أن تُفكَّ هنا فالصيغةُ أولُ ما يُنظر فيه.
لماذا هي مجانية؟
لأن تشغيلها لا يكلّف شيئًا. فالترميزُ وفكُّه يقعان في متصفحك وأنت تكتب؛ لا يُرفع شيء، ولا يُسجَّل شيء، ولا يرى خادومٌ نصَّك إذ لا خادومَ في الأمر.
فلا حساب ولا تسجيل ولا شيءَ محجوبٌ وراءهما. والأبجدياتُ وقواعدُ الحشو من RFC 4648 نفسِه، ومتجهاتُ الاختبار في المجموعة هي التي تنشرها المواصفة، والنتائجُ تُقابَل بمكتبة بايثون القياسية بوصفها تنفيذًا مستقلًّا.