php – 这个基于xor的加密函数安全吗?
我在这里尝试做的是创建一个函数,每次调用它时都会将相同的输入加密为完全不同的输出.此函数的基础是xor,但是为了防止在字符串中轻易发现重复模式.我根据时间和字符串的一部分添加了随机散列,以便在解密时进行自我验证.
我要求的是,如果我在这里犯了任何错误,可以向有经验的人透露隐藏的文字而不对字符串施加暴力. function crapt($str,$pass,$hmac = false,$meth = 'salsa20') { $hash = pack('H*',($hmac===false) ? hash($meth,$pass) : hash_hmac($meth,$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,$meth = 'salsa20') { $hash = pack('H*',$hmac)); $str = (string)$str ^ (string)str_repeat($hash,strlen($str)/strlen($hash)+1); $check = substr($str,-20); $str = substr($str,strlen($str)-20); if(pack('H*',sha1($str))!==$check) return false; $tmphash = substr($str,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')); 解决方法
您的算法以长度为strlen($hash)== strlen($tmphash)的块运行.编辑:错了,但见下文.
在密文中,第一个这样的块等于($tmphash XOR $hash).以下各项均等于(a_block_of_plaintext XOR $tmphash XOR $hash). 第一个密文块是数据的关键.只需重复密文的第一个块,然后得到明文即可.无需密码. 我不是PHP程序员,所以也许我错过了一些东西,但实际的攻击与此并没有太大的不同. 一般来说,只使用专业级加密模块.如果它们不可用,则您的应用程序不安全. 编辑:通过重读问题,我注意到$hash和$tmphash有不同的长度.$hash是512位,$tmphash是160位.然而,这并没有改变基本思想;由于512和160的最小公倍数是2560,所以这些块每2560位同步一次.因此,您只能解密每个2560位块的前160位. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |