【发布时间】:2011-11-24 19:23:30
【问题描述】:
我是 Xor 加密的新手,我在使用以下代码时遇到了一些问题:
function xor_this($string) {
// Let's define our key here
$key = ('magic_key');
// Our plaintext/ciphertext
$text =$string;
// Our output text
$outText = '';
// Iterate through each character
for($i=0;$i<strlen($text);)
{
for($j=0;$j<strlen($key);$j++,$i++)
{
$outText .= $text{$i} ^ $key{$j};
//echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging
}
}
return $outText;
}
当我运行它时,它适用于普通字符串,例如“dog”,但它仅部分适用于包含数字的字符串,例如“12345”。
为了演示……
xor_this('dog') = 'UYV'
xor_this('123') = ''
注意到xor_this( xor_this('123') ) = '123' 也很有趣,正如我所期望的那样。我很确定问题出在我对按位运算符的模糊理解中,或者可能是 PHP 处理包含数字的字符串的方式。我敢打赌那里有聪明的人确切地知道这里出了什么问题。谢谢。
编辑#1:这不是真正的“加密”。我想混淆是正确的术语,这就是我正在做的事情。我需要从用户那里传递一个包含不重要数据的代码,而他们不能轻易地篡改它。他们正在离线完成一项定时活动,并通过此代码将他们的时间提交到在线记分牌。离线活动将混淆他们的时间(以毫秒为单位)。我需要编写一个脚本来接收此代码并将其转回包含他们时间的字符串。
【问题讨论】:
-
我希望你不打算将它用于家庭作业以外的任何事情:P
-
尝试将
$string转换为类似$string = (string)$string的字符串。另外,请注意“加密”对于异或事物来说是一个相当强的词,所以不要在生产环境中使用它。 -
你工作太辛苦了。 PHP 很乐意对字符串的每个字符进行异或运算,并将结果作为另一个字符串给出。你不需要一个循环来自己做,只需做
$str1 ^ $str2。但当心!结果字符串将与最短字符串一样长! (包括空字符串!)所以先填充字符串,或者分块做。 -
如果您只使用 php 已经拥有的一些内置编码/解码功能,您可能会更安全并且工作量更少。例如 mcrypt 函数。 phpdoc 页面有示例。
标签: php bitwise-operators xor bitwise-xor