前書き
インターネット上で PHP の優れた対称暗号化アルゴリズムを見つけました。PHP 構文環境には、urlencode、urldecode、base64_encode、base64_decode を備えた対称アルゴリズムがありますが、これらの組み込みアルゴリズムは暗号化とは言えません。コーディング方法としか言えません。ただし、これらを使用して何らかの処理を実行し、単純な暗号化および復号化アルゴリズムを実装することができます。
今回の暗号化および復号化アルゴリズムはbase64を使用して適応されています。通常、base64_encode($str) によって生成された文字列を使用します。base64_decode() は何も処理せずに元の文字列に戻すことができますが、base64_encode() の後に文字列を挿入するとどうなるでしょうか。裏返しても、裏返しても自分の紐ではありません。
サンプルコードは次のとおりです:
<?php $content = "大家好,我是中国人,你是谁"; /** * 简单对称加密算法之加密 * @param String $string 需要加密的字串 * @param String $skey 加密EKY * @return String */ function encode($string = '', $skey = 'wenzi') { $strArr = str_split(base64_encode($string)); $strCount = count($strArr); foreach (str_split($skey) as $key => $value) $key < $strCount && $strArr[$key].=$value; return str_replace(array('=', '+', '/'), array('O0O0O', 'o000o', 'oo00o'), join('', $strArr)); } /** * 简单对称加密算法之解密 * @param String $string 需要解密的字串 * @param String $skey 解密KEY * @return String */ function decode($string = '', $skey = 'wenzi') { $strArr = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2); $strCount = count($strArr); foreach (str_split($skey) as $key => $value) $key <= $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0]; return base64_decode(join('', $strArr)); } echo '<pre class="brush:php;toolbar:false">'; echo "string : " . $content . " <br />"; echo "encode : " . ($enstring = encode($content)) . '<br />'; echo "decode : " . decode($enstring); exit();
上記のアルゴリズムからわかるように、事前に設定したキーをbase64_encode()で生成された文字に挿入し、他の人がそれを認識しても、内部の特殊文字を置き換えます。そのような文字列が何であるかわかりません。もちろん、ここで若干の改善を行うことができます。たとえば、キーを文字列に逆方向に挿入する、キーを Base64 化してから挿入するなど、キーを挿入してから再度 Base64 化するなどです。
もちろん、復号化は暗号化の逆方向です。しばらく考えた後、復号化の原理に気づきました。文字列に文字を挿入する前に、復号化するときにそれらを抽出する必要があります。暗号化された文字列 各配列内の 2 つの要素ごとにグループ化し、2 番目の文字がキー内にあるかどうかを判断します。そうである場合、最初の文字は元の Base64 の文字です。
概要
上記がこの記事の全内容です。もちろん、php には、base64 暗号化と復号化に加えて、AES や DES などのアルゴリズムもあります。必要な方は、Script Home に注目してください。それは誰にとっても役立ちます。
PHP での単純な対称暗号化アルゴリズムの実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。