在PHP中开发自己的对称加密算法

几年前,有一次,我有机会在一家公司做一份工作测试任务,该任务是在高级界面上开发一种非标准的对称加密算法,该算法在概念上与流派的经典概念有所不同-原始消息和秘密密钥的异或运算... 这项任务做得很差,但是创建一个有趣的非平凡算法的想法却长期困扰着我。



而且,此刻,我所谓的GenCoder已经证明了这一点



如果活动与密码学有关,那么可以期待有关特殊器官及其关系方面的评论。展望未来,我将说这项工作完全是出于实验和研究(非商业)目的而进行的。



实际上,该类的源代码可以在此处查看,您可以在此处进行测试



因此,(这个研究实验,我们将其称为)任务如下:



开发自己的可逆加密算法,同时:



  • 每次相同的消息将以唯一的方式加密,并且不会重复。
  • 介绍秘密密钥的所谓“随机化”-寻找一种方法,该方法不总是使用相同的秘密密钥而是使用特定的秘密字符串来加密消息,这是秘密密钥和原始消息的功能。
  • 作为不重要的补充,使密钥的长度可变,同时保持算法的高加密强度(在当前版本中-从64到100个字符)。
  • 如上所述,不要依赖于现有的解决方案,而是可以使用简单易懂的算法自行完成某些事情,而无需复杂的数学运算。


走。



选择对称加密进行开发。



通常,对称加密实现通常分为两大类:块密码和流密码。分组密码以小块的形式对原始消息进行加密,流密码通过将其与特定色域进行比较来对整个消息进行加密,也就是说,消息符号在原始消息中的位置也很重要。有点尴尬地说,显然并没有提出这个定义,但是它尽可能地易于理解。



尽管此处描述的算法不是纯形式的,但它更类似于流密码。



, , , . , , , , , .



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



, .



:



  • / ( )
  • ,


:



  • ( , ) , .


.



就算法的速度而言,它是相对较快的(当然,所有事情都是相对的并且是经过比较学习的,我们通常在高级yap框架中,尤其是在php框架中谈论加密的速度)。使用php 7.2在2秒内对2 MB的随机文本进行了加密和解密。系统:Intel Core i7-8700 CPU @ 3.20GHz×12,带有许多选项卡的浏览器和虚拟机仍在运行。摘要-在php7.0及更高版本的普通硬件上,加密速度约为1 mb / s。




All Articles