تشفير XOR
في علم التشفير ، تعد خوارزمية XOR البسيطة نوعًا من أنواع التشفير الجمعي ، [ 1 ] وهي خوارزمية تشفير تعمل وفقًا للمبادئ التالية:
- أ0 = أ،
- أأ = 0،
- أب = بأ،
- (أ)ب)ج = أ(ب)ج)،
- (ب)أ)أ = ب0 = ب
على سبيل المثال أينيشير الرمز XOR إلى عملية الفصل الحصري (XOR). [ 2 ] تُسمى هذه العملية أحيانًا عملية الجمع (أو الطرح ) بمعامل 2. [ 3 ] باستخدام هذا المنطق، يمكن تشفير سلسلة نصية بتطبيق عامل XOR الثنائي على كل حرف باستخدام مفتاح مُعطى. لفك تشفير الناتج، يكفي إعادة تطبيق دالة XOR مع المفتاح لإزالة التشفير.
مثال
يمكن تشفير السلسلة " Wiki " ( 01010111 01101001 01101011 01101001 في ASCII ذي 8 بت ) باستخدام المفتاح المتكرر 11110011 كما يلي:
01010111 01101001 01101011 01101001 11110011 11110011 11110011 11110011 = 10100100 10011010 10011000 10011010
وبالعكس، بالنسبة لفك التشفير:
10100100 10011010 10011000 10011010 11110011 11110011 11110011 11110011 = 01010111 01101001 01101011 01101001
الاستخدام والأمان
تُعدّ عملية XOR عنصرًا شائعًا للغاية في أنظمة التشفير الأكثر تعقيدًا. وباستخدام مفتاح متكرر ثابت، يُمكن فك تشفير XOR البسيط بسهولة باستخدام تحليل التردد . فإذا أمكن تخمين محتوى أي رسالة أو معرفته بطريقة أخرى، يُمكن الكشف عن المفتاح. وتكمن ميزتها الأساسية في سهولة تطبيقها، وانخفاض تكلفة عملية XOR الحسابية. ولذلك، يُستخدم تشفير XOR المتكرر البسيط (أي استخدام نفس المفتاح لعملية XOR على البيانات بأكملها) أحيانًا لإخفاء المعلومات في الحالات التي لا تتطلب مستوى أمان مُحددًا. كما يُستخدم تشفير XOR غالبًا في البرامج الضارة لجعل الهندسة العكسية أكثر صعوبة.
إذا كان المفتاح عشوائيًا وطوله مساويًا على الأقل لطول الرسالة، فإن تشفير XOR يكون أكثر أمانًا بكثير مما لو تكرر المفتاح داخل الرسالة. [ 4 ] عندما يتم توليد سلسلة المفاتيح بواسطة مولد أرقام شبه عشوائي ، تكون النتيجة تشفيرًا متسلسلًا . أما مع مفتاح عشوائي تمامًا ، فتكون النتيجة مفتاحًا لمرة واحدة ، وهو غير قابل للكسر نظريًا .
يُعد عامل XOR في أي من هذه التشفيرات عرضةً لهجوم النص الصريح المعروف ، لأن النص الصريحالنص المشفر = المفتاح . ومن السهل أيضًا قلب أي بتات عشوائية في النص الأصلي الذي تم فك تشفيره عن طريق التلاعب بالنص المشفر. وهذا ما يسمى بالمرونة .
فائدتها في علم التشفير
السبب الرئيسي وراء فائدة عملية XOR في علم التشفير هو أنها "متوازنة تمامًا"؛ فبالنسبة لنص عادي مُدخل إما 0 أو 1، فإن احتمالية أن تكون نتيجة النص المشفر إما 0 أو 1 متساوية بالنسبة لبت مفتاح عشوائي تمامًا. [ 5 ]
يُبيّن الجدول أدناه جميع الأزواج الأربعة الممكنة من بتات النص الأصلي وبتات المفتاح. من الواضح أنه إذا لم يكن معروفًا أي شيء عن المفتاح أو النص الأصلي، فلا يمكن تحديد أي شيء من النص المشفر وحده. [ 5 ]
| نص عادي | مفتاح | النص المشفر |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
لا توجد مثل هذه المطابقة بين العمليات المنطقية الأخرى مثل "و " و" أو " . على سبيل المثال، انظر إلى الجدول الخاص بعملية "و" أدناه:
| نص عادي | مفتاح | النص المشفر |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
إذا كانت قيمة النص المشفر صفرًا، فهناك احتمال بنسبة 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 ()انظر أيضاً
مراجع
ملحوظات
- ↑ توجد ثلاث طرق للحصول على بت إخراج (نص مشفر) قيمته صفر من عملية AND : النص الأصلي = 0، المفتاح = 0؛ النص الأصلي = 0، المفتاح = 1؛ النص الأصلي = 1، المفتاح = 0. لذلك، إذا علمنا أن بت النص المشفر هو صفر، فهناك احتمال بنسبة 2/3 أن يكون بت النص الأصلي أيضًا صفرًا لمفتاح عشوائي تمامًا. أما بالنسبة لعملية XOR، فهناك طريقتان فقط، لذا فإن الاحتمال هو 1/2 (أي متساوي الاحتمال، وبالتالي لا يمكننا استخلاص أي معلومات من هذه المعلومة).
- ↑ استُلهم هذا من ريختر 2012
الاقتباسات
- ↑ Tutte 1998 ، ص 3
- ↑ Lewin 2012 ، ص 14-19.
- ↑ تشيرشهاوس 2002 ، ص 11
- ↑ تشيرشهاوس 2002 ، ص 68
- 1 2 بار وبيلزل 2009 ، ص 32-34.
- ^ ارماسحر/XOR-Cipher ، 2025-09-26
مصادر
- بوديمان، م.أ.؛ تاريجان، ج.ت.؛ ويناتا، أ.س. (2020). "قفل رقمي قائم على أردوينو أونو ونظام أندرويد باستخدام مزيج من تشفير فيجنير وتشفير XOR" . مجلة الفيزياء: سلسلة المؤتمرات . 1566 (1) 012074. دار نشر IOP. رمز Bibcode : 2020JPhCS1566a2074B . doi : 10.1088/1742-6596/1566/1/012074 . ISSN 1742-6588 .
- تشرشهاوس، روبرت (2002)، الشفرات والرموز: يوليوس قيصر، إنجما، والإنترنت ، كامبريدج: مطبعة جامعة كامبريدج، رقم ISBN 978-0-521-00890-7
- غارغ، ساتيش كومار (2017). "التشفير باستخدام تشفير XOR" . مجلة البحوث في العلوم والتكنولوجيا . 9 (1). منشورات A وV: 25. doi : 10.5958/2349-2988.2017.00004.3 . ISSN 0975-4393 .
- جودل ، كورت (ديسمبر 1931). "Über الرسمي unentscheidbare Sätze der Principia Mathematica und verwandter Systeme I". Monatshefte für Mathematik und Physik (باللغة الألمانية). 38– 38 (1): 173– 198. دوى : 10.1007 / BF01700692 . ISSN 0026-9255 . S2CID 197663120 .
- ليوين، مايكل (يونيو 2012). "كل شيء عن XOR" . التحميل الزائد . 2 (109): 14-19 . تم الاسترجاع في 29 أغسطس 2021 .
- بار، كريستوف؛ بيلزل، يان (2009). فهم التشفير: كتاب مدرسي للطلاب والممارسين . سبرينغر. ISBN 978-3-642-04101-3. OCLC 567365751 .
- ريختر، فولفغانغ (3 أغسطس 2012)، "التشفير غير القابل للكسر في 5 دقائق" ، كروس رودز: مجلة ACM للطلاب ، رابطة آلات الحوسبة
- توتي، دبليو تي (19 يونيو 1998)، السمكة وأنا (ملف PDF) ، مؤرشف من الأصل (ملف PDF) في 7 فبراير 2020 ، تم استرجاعه في 11 يناير 2020نص محاضرة ألقاها البروفيسور توت في جامعة واترلو
- تشفيرات التدفق
