То, что я пытался сделать здесь, - это создать функцию, которая будет шифровать один и тот же вход в совершенно разные выходные данные при каждом его вызове. Основой этой функции является xor, но она предотвращает легкое обнаружение повторяющихся паттернов в строке. Я добавил случайное хеширование на основе времени и части строки для самопроверки при расшифровке.
Все, что я прошу, это если я допустил какие-либо ошибки, которые могли бы показать скрытый текст опытному человеку, не применяя грубую силу к строке.
(Я знаю, что в php есть модуль только для шифрования, но это плохая версия на случай, если модуль шифрования недоступен.)
Второе: Я не прошу вас переписать эти функции или написать что-то для меня , я прошу лишь простое руководство о том, что я сделал неправильно.
Я знаю, что одним из возможных нарушений безопасности является то, что я по умолчанию использую сальсу, которая представляет собой все нули для пустой строки, но преимущество в том, что это самый длинный хеш, доступный в 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'));