我在调试了为什么not working on my server之后,在CakePHP的核心类中找到了这个加密解密代码。
我只是想知道它背后的逻辑。它是如何设法加密和解密的?为什么带有$ j的for..loop,以及XOR运算符^如何帮助?
function cipher($text, $key) {
if (!defined('CIPHER_SEED')) {
//This is temporary will change later
define('CIPHER_SEED', '76859309657453542496749683645');
}
srand(CIPHER_SEED);
$out = '';
for ($i = 0; $i < strlen($text); $i++) {
for ($j = 0; $j < ord(substr($key, $i % strlen($key), 1)); $j++) {
$toss = rand(0, 255);
}
$mask = rand(0, 255);
$out .= chr(ord(substr($text, $i, 1)) ^ $mask);
}
return $out;
}
答案 0 :(得分:2)
^
是按位XOR运算符。因此,它依次通过按位对每个字符进行加密,并将其与“随机”字符进行异或。该操作是它自己的反转,即(a ^ b) ^ b == a
。因此,只要您在解密期间生成与加密过程中相同的“随机”掩码字符序列,您就可以随时取回您开始使用的内容。
$j
循环似乎正在使用$key
来丢弃rand()
生成的值的某一部分流。这看起来像是从同一个RNG中获取许多不同随机流的廉价方式。不过,我不确定这是否是一种非常安全的方法。与AES等既定方法相比,家庭酿造的加密尝试通常具有极其严重的缺陷。