Desenvolvimento de seu próprio algoritmo de criptografia simétrica em Php

Certa vez, há vários anos, tive a chance de fazer uma tarefa de teste para emprego em uma empresa, onde a tarefa era desenvolver um algoritmo de criptografia simétrica não padrão em um yap de alto nível, que é conceitualmente um pouco diferente dos clássicos do gênero - a operação xor da mensagem original e a chave secreta ... A tarefa foi mal executada, mas a própria ideia de criar um algoritmo não trivial interessante ficou na minha cabeça por um longo tempo.



E, no momento, o que chamei de GenCoder resultou dele .



Antecipando comentários sobre órgãos especiais e aspectos da relação com eles, se a atividade for relacionada à criptografia, olhando para o futuro, direi que o trabalho é realizado exclusivamente para fins experimentais e de pesquisa (não comerciais).



Na verdade, o código-fonte da classe pode ser visto aqui , e você pode testá-lo aqui .



Portanto, a tarefa (deste experimento de pesquisa, como a chamaremos) foi a seguinte:



Desenvolva seu próprio algoritmo de criptografia reversível, enquanto:



  • Cada vez, a mesma mensagem será criptografada de uma maneira única e não será repetida.
  • Apresente a chamada " randomização " da chave secreta - encontre uma maneira de criptografar mensagens não com a mesma chave secreta o tempo todo, mas com uma string secreta que é uma função da chave secreta e da mensagem original.
  • Como um acréscimo sem importância, faça com que o comprimento da chave secreta seja variável enquanto mantém a alta força criptográfica do algoritmo (na versão atual, de 64 a 100 caracteres).
  • , , , , .


.



.



, , . , , , . , .



, .



, , , . , , , , , .



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



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



Em termos de velocidade do algoritmo, é relativamente rápido (claro, tudo é relativo e é aprendido em comparação, estamos falando sobre a velocidade da criptografia no framework do yap de alto nível em geral e no framework do php em particular). 2 megabytes de texto aleatório foram criptografados e descriptografados em 4 segundos usando php 7.2. Sistema: Intel Core i7-8700 CPU a 3,20 GHz × 12, um navegador com várias guias e uma máquina virtual ainda estavam em execução. Resumo - velocidade de criptografia ~ 1 mb / s em um hardware médio com php7.0 e superior.




All Articles