我在这里尝试做的是创建一个函数,每次调用它时都会将相同的输入加密为完全不同的输出。此函数的基础是 xor,但为了防止容易发现字符串中的重复模式。我添加了基于时间和字符串部分的随机散列,以在解密时进行自我验证。
我所要求的只是我是否在这里犯了任何类型的错误,这些错误可能会向有经验的人揭示隐藏的文本,而无需对字符串进行暴力破解。(我知道 php 有一个仅用于加密的模块,但这是一个糟糕的版本,以防加密模块不可用。)第二:我不要求你重写这个函数或为我写一些东西,我要求的是一个简单的指导我做错了什么。我知道一个可能的安全漏洞是我默认使用salsa,空字符串全为零,但优点是这是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'));