Entwicklung eines eigenen symmetrischen Verschlüsselungsalgorithmus in Php

Vor einigen Jahren hatte ich einmal die Gelegenheit, eine Testaufgabe für eine Anstellung in einem Unternehmen zu erledigen, bei der es darum ging, einen nicht standardmäßigen symmetrischen Verschlüsselungsalgorithmus auf hoher Ebene zu entwickeln, der sich konzeptionell etwas von den Klassikern des Genres unterscheidet - der xor-Operation der Originalnachricht und dem geheimen Schlüssel ... Die Aufgabe war schlecht erledigt, aber die Idee, einen interessanten, nicht trivialen Algorithmus zu entwickeln, blieb mir lange im Kopf.



Und im Moment hat sich herausgestellt, was ich GenCoder nannte .



Wenn ich Kommentare zu speziellen Organen und Aspekten der Beziehung zu ihnen vorwegnehme und die Aktivität mit Blick auf die Kryptographie in Verbindung stehe, werde ich sagen, dass die Arbeiten ausschließlich zu experimentellen und Forschungszwecken (nichtkommerziell) durchgeführt werden.



Tatsächlich kann der Quellcode der Klasse hier angezeigt und hier getestet werden .



Die Aufgabe (dieses Forschungsexperiments, wie wir es nennen werden) war also wie folgt:



Entwickeln Sie Ihren eigenen reversiblen Verschlüsselungsalgorithmus, während:



  • Jedes Mal wird dieselbe Nachricht auf einzigartige Weise verschlüsselt und nicht wiederholt.
  • Führen Sie die sogenannte " Randomisierung " des geheimen Schlüssels ein - finden Sie einen Weg, Nachrichten nicht immer mit demselben geheimen Schlüssel zu verschlüsseln, sondern mit einer geheimen Zeichenfolge, die eine Funktion des geheimen Schlüssels und der ursprünglichen Nachricht ist.
  • Machen Sie als unwichtige Ergänzung die Länge des geheimen Schlüssels variabel, während Sie die hohe kryptografische Stärke des Algorithmus beibehalten (in der aktuellen Version - von 64 bis 100 Zeichen).
  • Wie oben erwähnt, hängen Sie nicht an vorhandenen Lösungen, sondern machen Sie etwas Eigenes ohne komplizierte Mathematik mit einem einfachen und verständlichen Algorithmus.


Gehen.



Für die Entwicklung wurde eine symmetrische Verschlüsselung gewählt.



, , . , , , . , .



, .



, , , . , , , , , .



, , , (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 , , .



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



In Bezug auf die Geschwindigkeit des Algorithmus ist er relativ schnell (natürlich ist alles relativ und wird im Vergleich verstanden, wir sprechen über die Geschwindigkeit der Verschlüsselung im Rahmen von High-Level-Yap im Allgemeinen und im Rahmen von PHP im Besonderen). 2 Megabyte zufälliger Text wurden in 4 Sekunden mit PHP 7.2 verschlüsselt und entschlüsselt. System: Intel Core i7-8700-CPU mit 3,20 GHz × 12, ein Browser mit mehreren Registerkarten und eine virtuelle Maschine wurden noch ausgeführt. Zusammenfassung - Verschlüsselungsgeschwindigkeit ~ 1 MBit / s auf einer durchschnittlichen Hardware mit PHP7.0 und höher.




All Articles