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.