ここで私が試みたのは、呼び出されるたびに同じ入力を完全に異なる出力に暗号化する関数を作成することです。この関数のベースは xor ですが、文字列内の繰り返しパターンを簡単に見つけられないようにするためです。時間と文字列の部分に基づいてランダムなハッシュを追加し、説明を自己検証しました。
私が求めるのは、文字列にブルート フォースを実行することなく、経験豊富な人に隠されたテキストを明らかにするようなエラーをここで行ったかどうかだけです。(phpには暗号化専用のモジュールがあることは知っていますが、暗号化モジュールが利用できない場合に備えて、これは貧弱なバージョンです。) 2番目:この関数を書き直したり、私のために何かを書いたりすることは求めていません。私が間違ったことをした簡単なガイダンス。セキュリティ違反の可能性の 1 つは、デフォルトでサルサを使用していることです。これは、空の文字列に対してすべてゼロですが、利点は、これが php で利用可能な最長のハッシュであることです。
function crapt($str,$pass,$hmac = false,$meth = 'salsa20') {
$hash = pack('H*',($hmac===false) ? hash($meth,$pass) : hash_hmac($meth,$pass,$hmac));
$str = gzdeflate($str,9);
$tmphash = pack('H*',sha1(sin(microtime(1))));
$str = $tmphash.((string)$str ^ (string)str_repeat($tmphash,strlen($str)/strlen($tmphash)+1));
$str .= pack('H*',sha1($str));
return (string)$str ^ (string)str_repeat($hash,strlen($str)/strlen($hash)+1);
}
function decrapt($str,$pass,$hmac = false,$meth = 'salsa20') {
$hash = pack('H*',($hmac===false) ? hash($meth,$pass) : hash_hmac($meth,$pass,$hmac));
$str = (string)$str ^ (string)str_repeat($hash,strlen($str)/strlen($hash)+1);
$check = substr($str,-20);
$str = substr($str,0,strlen($str)-20);
if(pack('H*',sha1($str))!==$check) return false;
$tmphash = substr($str,0,20);
$str = substr($str,20);
return gzinflate((string)$str ^ (string)str_repeat($tmphash,strlen($str)/strlen($tmphash)+1));
}
var_dump(decrapt(crapt('sometext','secretpassword'),'secretpassword'));