Desarrollo de su propio algoritmo de cifrado simétrico en Php

Una vez, hace varios años, tuve la oportunidad de hacer una prueba de empleo en una empresa, donde la tarea era desarrollar un algoritmo de cifrado simétrico no estándar en un yap de alto nivel, que es conceptualmente algo diferente de los clásicos del género: la operación xor del mensaje original y la clave secreta ... La tarea estaba mal hecha, pero la idea misma de crear un algoritmo interesante no trivial se quedó en mi cabeza durante mucho tiempo.



Y, por el momento, lo que llamé GenCoder resultó de ello .



Anticipando comentarios sobre órganos especiales y aspectos de la relación con ellos, si la actividad está relacionada con la criptografía, de cara al futuro, diré que el trabajo se realiza exclusivamente con fines experimentales y de investigación (no comerciales).



En realidad, el código fuente de la clase se puede ver aquí y puedes probarlo aquí .



Entonces, la tarea (de este experimento de investigación, como lo llamaremos) fue la siguiente:



Desarrolle su propio algoritmo de cifrado reversible, mientras:



  • Cada vez, el mismo mensaje se cifrará de una manera única y no se repetirá.
  • Introduzca la llamada " aleatorización " de la clave secreta, para encontrar una forma de cifrar los mensajes no siempre con la misma clave secreta, sino con una determinada cadena secreta, que es una función de la clave secreta y el mensaje original.
  • Como una adición sin importancia, haga que la clave secreta sea de longitud variable mientras se mantiene la alta fuerza criptográfica del algoritmo (en la versión actual, de 64 a 100 caracteres).
  • Como se mencionó anteriormente, no se apegue a las soluciones existentes, pero haga algo por su cuenta, sin matemáticas complicadas, con un algoritmo simple y comprensible.


Vamos.



Se eligió el cifrado simétrico para el desarrollo.



, , . , , , . , .



, .



, , , . , , , , , .



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



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



En cuanto a la velocidad del algoritmo, es relativamente rápido (por supuesto, todo es relativo y se aprende en comparación, estamos hablando de la velocidad de cifrado en el marco de yap de alto nivel en general y en el marco de php en particular). Se cifraron y descifraron 2 megabytes de texto aleatorio en 4 segundos usando php 7.2. Sistema: CPU Intel Core i7-8700 @ 3.20GHz × 12, un navegador con un montón de pestañas y una máquina virtual todavía se estaban ejecutando. Resumen: velocidad de cifrado de ~ 1 mb / s en un hardware promedio con php7.0 y superior.




All Articles