تطوير خوارزمية التشفير المتماثل الخاصة بك في Php

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



وفي الوقت الحالي ، ظهر ما أسميته GenCoder منه .



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



في الواقع ، يمكن الاطلاع على الكود المصدري للفصل هنا ، ويمكنك اختباره هنا .



إذن ، كانت مهمة (هذه التجربة البحثية ، كما سنسميها) كما يلي:



طور خوارزمية التشفير العكسي الخاصة بك ، بينما:



  • في كل مرة يتم تشفير نفس الرسالة بطريقة فريدة ولن تتكرر.
  • أدخل ما يسمى بـ " التوزيع العشوائي " للمفتاح السري - لإيجاد طريقة لتشفير الرسائل ليس دائمًا بنفس المفتاح السري ، ولكن بسلسلة سرية معينة ، وهي وظيفة المفتاح السري والرسالة الأصلية.
  • كإضافة غير مهمة ، اجعل طول المفتاح السري متغيرًا مع الحفاظ على قوة التشفير العالية للخوارزمية (في الإصدار الحالي - من 64 إلى 100 حرف).
  • كما ذكرنا أعلاه ، لا تلتصق بالحلول الحالية ، ولكن افعل شيئًا خاصًا بك ، بدون رياضيات معقدة ، باستخدام خوارزمية بسيطة ومفهومة.


اذهب.



تم اختيار التشفير المتماثل للتطوير.



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



الخوارزمية الموصوفة هنا تشبه إلى حد كبير تشفير التدفق ، على الرغم من أنها ليست في شكلها النقي.



, , , . , , , , , .



, , , (pathKeySignature ), . — sha-512 , , uniqid, .



? , . , , 14-, 22-, 37-, 49- .. — ( pathKeySignature).



, ( , - , ). , " " xor-.



"" , (pass1 pass2, 4 ), , , , - .



. , , (, ) .



.



private function attachKey($message, $salt)
    {
        return md5(hash('sha512', $message . uniqid() . $salt) . hash('sha512', $salt));
    }

    private function pathKeySignature($user_code_1, $user_code_2, $attach_key)
    {
        return hash('sha512', $user_code_1 . $attach_key . $user_code_2);
    }


, md5 - , , ( sha512) attachKey. uniqid , , . ? , . — , . ? , , "!", " ", "", " ", " ?". , , . , 1 2 "0372985dee", 2 5 "0372985dee" . ? .

uniqid, .



. , cipher $path_key_signature, byteShifting .



private function cipher($path_key_signature, $message, $generateKey)
    {
...
        for ($i = 0; $i < count($message); $i++) {
            if ($sign_key >= self::hash_length) $sign_key = 0;
            $key_code_pos = hexdec($path_key_signature[$sign_key]);
            $cur_key_pos = $cur_key_pos + $key_code_pos;
            if ($cur_key_pos >= $key_length) {
                $cur_key_pos = $cur_key_pos - $key_length;
            }
            $shifted_key_symbol = $generateKey[$cur_key_pos];
            // byte shifting
            $shifted_key_symbol = $this->byteShifting($i, $shifted_key_symbol);
            $shifter = $this->mb_ord($message{$i}) ^ $this->mb_ord($shifted_key_symbol);
            $cipher_message .= $this->mb_chr($shifter);
            $sign_key++;
        }
        return $cipher_message;
    }


, attachKey pathKeySignature . , , $attach_key



public function codeMessage($message, $generateKey, $user1_pass, $receiver_hashcode)
    {
        $sender_hashcode = $this->sender_hashcode($user1_pass);
        $attach_key = $this->attachKey($message, $this->salt);
        $path_key_signature = $this->pathKeySignature($sender_hashcode, $receiver_hashcode, $attach_key);
        $result_cipher = $this->cipher($path_key_signature, $message, $generateKey) . $attach_key;
        $result_cipher = base64_encode($result_cipher);
        return gzencode($result_cipher, 9);
    }


, . attachKey, ? , "" — attachKey , , . , , , "" . , , . . .



decodeMessage , , .



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



من حيث سرعة الخوارزمية ، فهي سريعة نسبيًا (بالطبع كل شيء نسبي ومفهوم بالمقارنة ، نحن نتحدث عن سرعة التشفير في إطار yap عالي المستوى بشكل عام وفي إطار php بشكل خاص). تم تشفير 2 ميغا بايت من النصوص العشوائية وفك تشفيرها في 4 ثوانٍ باستخدام php 7.2. النظام: Intel Core i7-8700 CPU @ 3.20GHz × 12 ، متصفح به مجموعة من علامات التبويب وجهاز افتراضي لا يزال قيد التشغيل. ملخص - سرعة التشفير حوالي 1 ميجابايت / ثانية على جهاز متوسط ​​مع php7.0 وأعلى.




All Articles