تشفير XOR

في علم التشفير ، تعد خوارزمية XOR البسيطة نوعًا من أنواع التشفير الجمعي ، [ 1 ] وهي خوارزمية تشفير تعمل وفقًا للمبادئ التالية:

أ{\displaystyle \oplus }0 = أ،
أ{\displaystyle \oplus }أ = 0،
أ{\displaystyle \oplus }ب = ب{\displaystyle \oplus }أ،
(أ){\displaystyle \oplus }ب){\displaystyle \oplus }ج = أ{\displaystyle \oplus }(ب){\displaystyle \oplus }ج)،
(ب){\displaystyle \oplus }أ){\displaystyle \oplus }أ = ب{\displaystyle \oplus }0 = ب

على سبيل المثال أين{\displaystyle \oplus }يشير الرمز XOR إلى عملية الفصل الحصري (XOR). [ 2 ] تُسمى هذه العملية أحيانًا عملية الجمع (أو الطرح ) بمعامل 2. [ 3 ] باستخدام هذا المنطق، يمكن تشفير سلسلة نصية بتطبيق عامل XOR الثنائي على كل حرف باستخدام مفتاح مُعطى. لفك تشفير الناتج، يكفي إعادة تطبيق دالة XOR مع المفتاح لإزالة التشفير.

مثال

يمكن تشفير السلسلة " Wiki " ( 01010111 01101001 01101011 01101001 في ASCII ذي 8 بت ) باستخدام المفتاح المتكرر 11110011 كما يلي:

01010111 01101001 01101011 01101001
{\displaystyle \oplus }11110011 11110011 11110011 11110011
=10100100 10011010 10011000 10011010

وبالعكس، بالنسبة لفك التشفير:

10100100 10011010 10011000 10011010
{\displaystyle \oplus }11110011 11110011 11110011 11110011
=01010111 01101001 01101011 01101001

الاستخدام والأمان

تُعدّ عملية XOR عنصرًا شائعًا للغاية في أنظمة التشفير الأكثر تعقيدًا. وباستخدام مفتاح متكرر ثابت، يُمكن فك تشفير XOR البسيط بسهولة باستخدام تحليل التردد . فإذا أمكن تخمين محتوى أي رسالة أو معرفته بطريقة أخرى، يُمكن الكشف عن المفتاح. وتكمن ميزتها الأساسية في سهولة تطبيقها، وانخفاض تكلفة عملية XOR الحسابية. ولذلك، يُستخدم تشفير XOR المتكرر البسيط (أي استخدام نفس المفتاح لعملية XOR على البيانات بأكملها) أحيانًا لإخفاء المعلومات في الحالات التي لا تتطلب مستوى أمان مُحددًا. كما يُستخدم تشفير XOR غالبًا في البرامج الضارة لجعل الهندسة العكسية أكثر صعوبة.

إذا كان المفتاح عشوائيًا وطوله مساويًا على الأقل لطول الرسالة، فإن تشفير XOR يكون أكثر أمانًا بكثير مما لو تكرر المفتاح داخل الرسالة. [ 4 ] عندما يتم توليد سلسلة المفاتيح بواسطة مولد أرقام شبه عشوائي ، تكون النتيجة تشفيرًا متسلسلًا . أما مع مفتاح عشوائي تمامًا ، فتكون النتيجة مفتاحًا لمرة واحدة ، وهو غير قابل للكسر نظريًا .

يُعد عامل XOR في أي من هذه التشفيرات عرضةً لهجوم النص الصريح المعروف ، لأن النص الصريح{\displaystyle \oplus }النص المشفر = المفتاح . ومن السهل أيضًا قلب أي بتات عشوائية في النص الأصلي الذي تم فك تشفيره عن طريق التلاعب بالنص المشفر. وهذا ما يسمى بالمرونة .

فائدتها في علم التشفير

السبب الرئيسي وراء فائدة عملية XOR في علم التشفير هو أنها "متوازنة تمامًا"؛ فبالنسبة لنص عادي مُدخل إما 0 أو 1، فإن احتمالية أن تكون نتيجة النص المشفر إما 0 أو 1 متساوية بالنسبة لبت مفتاح عشوائي تمامًا. [ 5 ]

يُبيّن الجدول أدناه جميع الأزواج الأربعة الممكنة من بتات النص الأصلي وبتات المفتاح. من الواضح أنه إذا لم يكن معروفًا أي شيء عن المفتاح أو النص الأصلي، فلا يمكن تحديد أي شيء من النص المشفر وحده. [ 5 ]

جدول تتبع تشفير XOR
نص عاديمفتاحالنص المشفر
000
011
101
110

لا توجد مثل هذه المطابقة بين العمليات المنطقية الأخرى مثل "و " و" أو " . على سبيل المثال، انظر إلى الجدول الخاص بعملية "و" أدناه:

وجدول تتبع التشفير
نص عاديمفتاحالنص المشفر
000
010
100
111

إذا كانت قيمة النص المشفر صفرًا، فهناك احتمال بنسبة 2/3 أن تكون قيمة النص الأصلي صفرًا أيضًا. وإذا كانت قيمة النص المشفر واحدًا، فلا بد أن تكون قيمة النص الأصلي واحدًا. وهذا يكشف بوضوح معلومات عن النص لا تكشفها طريقة XOR. [ أ ]

مثال على التنفيذ

مثال باستخدام لغة البرمجة جافا سكريبت . [ 6 ]

دالة xor_Encrypt ( inputString , key ) { let encrypted_Hex = "" ; for ( let i = 0 ; i < inputString . length ; i ++ ) { const plain_string = inputString . charCodeAt ( i ); const key_Char = key . charCodeAt ( i % key . length ); const xor_Result = plain_string ^ key_Char ; // تنفيذ عملية XOR // تحويل نتيجة XOR إلى سلسلة سداسية عشرية مكونة من رقمين // إضافة '0' إذا كانت رقمًا واحدًا (مثلاً، 5 -> "05") let hex = xor_Result . toString ( 16 ); if ( hex . length < 2 ) { hex = "0" + hex ; } encrypted_Hex += hex ; } return encrypted_Hex ; }دالة xorDecrypt ( hexInput , key ) { let decrypted_String = '' ; // الخطوة 1: تحويل سلسلة hexInput إلى مصفوفة const bytes = []; // المرور على سلسلة hex حرفين في كل مرة for ( let i = 0 ; i < hexInput . length ; i += 2 ) { // أخذ سلسلة hex فرعية مكونة من حرفين (مثل "AB") const hexa_Byte = hexInput . slice ( i , i + 2 ); // تحويل السلسلة الفرعية hex إلى عدد صحيح (مثل "AB" -> 171) bytes . push ( parseInt ( hexa_Byte , 16 )); } // الخطوة 2: إجراء عملية XOR على كل بايت مع المفتاح وتحويله مرة أخرى إلى حرف for ( let i = 0 ; i < bytes . length ; i ++ ) { const byte_Value = bytes [ i ]; const key_Char = key.charCodeAt ( i % key.length ) ; const xor_Result = byte_Value ^ key_Char ; // تنفيذ عملية XOR // تحويل نتيجة XOR إلى حرف decrypted_String + = String.fromCharCode ( xor_Result ) ; } return decrypted_String ; }

مثال آخر باستخدام لغة البرمجة بايثون . [ ب ]

from os import urandomدالة توليد_المفتاح ( الطول : عدد صحيح ) -> بايتات : """توليد مفتاح التشفير.""" إرجاع urandom ( الطول )دالة xor_strings ( s , t ) -> bytes : """دمج سلسلتين نصيتين معًا باستخدام عملية XOR.""" إذا كانت s من نوع str : # تحتوي السلاسل النصية على أحرف مفردة return "" . join ( chr ( ord ( a ) ^ b ) for a , b in zip ( s , t )) . encode ( "utf8" ) else : # تحتوي كائنات البايتات على قيم عددية صحيحة في النطاق 0-255 return bytes ([ a ^ b for a , b in zip ( s , t )])رسالة = "هذه رسالة سرية" طباعة ( "الرسالة: " , رسالة )key = generate_key ( len ( message )) print ( "Key: " , key )cipherText = xor_strings ( message.encode ( " utf8" ) , key ) print ( "cipherText:" , cipherText ) print ( "decrypted:" , xor_strings ( cipherText , key ) .decode ( " utf8") ))# تحقق مما إذا كانت نتيجة عملية فك تشفير النص المشفر ( cipherText , key ) باستخدام ترميز UTF-8 تساوي نتيجة اختبار الوحدة : اطبع ( "نجح اختبار الوحدة" ) وإلا : اطبع ( " فشل اختبار الوحدة" ).

مثال أقصر باستخدام لغة البرمجة R ، استنادًا إلى لغز نشرته GCHQ على Instagram .

secret_key <- c ( 0xc6 , 0xb5 , 0xca , 0x01 ) |> as.raw ()secret_message <- "أنا أحب ويكيبيديا" |> charToRaw () |> xor ( secret_key ) |> base64enc :: base64encode ()secret_message_bytes <- secret_message |> base64enc :: base64decode () xor ( secret_message_bytes , secret_key ) |> rawToChar ()

انظر أيضاً

مراجع

ملحوظات

  1. توجد ثلاث طرق للحصول على بت إخراج (نص مشفر) قيمته صفر من عملية AND : النص الأصلي = 0، المفتاح = 0؛ النص الأصلي = 0، المفتاح = 1؛ النص الأصلي = 1، المفتاح = 0. لذلك، إذا علمنا أن بت النص المشفر هو صفر، فهناك احتمال بنسبة 2/3 أن يكون بت النص الأصلي أيضًا صفرًا لمفتاح عشوائي تمامًا. أما بالنسبة لعملية XOR، فهناك طريقتان فقط، لذا فإن الاحتمال هو 1/2 (أي متساوي الاحتمال، وبالتالي لا يمكننا استخلاص أي معلومات من هذه المعلومة).
  2. استُلهم هذا من ريختر 2012

الاقتباسات

مصادر