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のフレームワークでの暗号化の速度について話します)。2メガバイトのランダムテキストは、php7.2を使用して4秒で暗号化および復号化されました。システム:Intel Core i7-8700 CPU @ 3.20GHz×12、多数のタブを備えたブラウザと仮想マシンがまだ実行されていました。まとめ-php7.0以降の平均的なハードウェアでは、暗号化速度は約1 mb / sです。




All Articles