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.