Développement de votre propre algorithme de cryptage symétrique en Php

Une fois, il y a plusieurs années, j'ai eu la chance de faire une tâche de test pour l'emploi dans une entreprise, où la tâche était de développer un algorithme de cryptage symétrique non standard à un yap de haut niveau, idéologiquement un peu différent des classiques du genre - l'opération xor du message original et de la clé secrète ... La tâche était mal faite, mais l'idée même de créer un algorithme intéressant non trivial me restait longtemps en tête.



Et, pour le moment, ce que j'ai appelé GenCoder en est sorti .



Anticipant les commentaires sur les organes spéciaux et les aspects de la relation avec eux, si l'activité est liée à la cryptographie, je dirai que le travail est effectué exclusivement à des fins expérimentales et de recherche (non commerciales).



En fait, le code source de la classe peut être consulté ici , et vous pouvez le tester ici .



Ainsi, la tâche (de cette expérience de recherche, comme nous l'appellerons) était la suivante:



Développez votre propre algorithme de chiffrement réversible, tout en:



  • A chaque fois, le mĂŞme message sera cryptĂ© de manière unique et ne sera pas rĂ©pĂ©tĂ©.
  • Introduisez la soi-disant « randomisation » de la clĂ© secrète - pour trouver un moyen de crypter les messages non pas tout le temps avec la mĂŞme clĂ© secrète, mais avec une certaine chaĂ®ne secrète qui est fonction de la clĂ© secrète et du message d'origine.
  • Comme ajout sans importance, faites en sorte que la clĂ© secrète soit de longueur variable tout en conservant la force cryptographique Ă©levĂ©e de l'algorithme (dans la version actuelle, de 64 Ă  100 caractères).
  • Comme mentionnĂ© ci-dessus, ne vous attachez pas Ă  des solutions existantes, mais faites quelque chose de vous-mĂŞme, sans mathĂ©matiques compliquĂ©es, avec un algorithme simple et comprĂ©hensible.


Aller.



Le chiffrement symétrique a été choisi pour le développement.



, , . , , , . , .



, .



, , , . , , , , , .



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



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



Pour ce qui est de la vitesse de l'algorithme, il est relativement rapide (bien sûr, tout est relatif et s'apprend en comparaison, on parle de la vitesse de cryptage dans le cadre du yap de haut niveau en général et dans le cadre de php en particulier). 2 mégaoctets de texte aléatoire ont été cryptés et décryptés en 4 secondes en utilisant php 7.2. Système: Processeur Intel Core i7-8700 à 3,20 GHz × 12, un navigateur avec un tas d'onglets et une machine virtuelle étaient toujours en cours d'exécution. Résumé - la vitesse de cryptage est d'environ 1 mb / s sur un matériel moyen avec php7.0 et supérieur.




All Articles