1

perl中的情况

$password = 'admin';
$newchal = 'hnfdfhj238478wdehf';

$password2 = unpack "H32", ($password ^ $newchal);

这非常重要,因为我将此密码发送到需要正确编码的半径服务器。上面的这个方法来自标准脚本。

现在在 PHP 中我尝试过:

$password2 = unpack("H32", $password.''.$newchal);

我比较了结果,但结果不同..我无法弄清楚'^'在perl中的含义。谁能帮我吗?

4

1 回答 1

2

是C 派生语言(包括 Perl 和 PHP)中的按位 XOR(异或)运算^

如需更多信息,请阅读PHPPerl的文档。

当两个操作数中的一个为真时,异或运算为真。真值表是

0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0

当对字符串使用按位异或时,二进制表示的每个位都被异或在一起。

例如aASCII0x61hASCII 0x68。异或在一起,它们产生一个标签:

a  (61): 01100001
h  (68): 01101000
\t (09): 00001001

按位异或有时用于可逆的“加密”,但这种技巧广为人知,而且非常不安全。例如,在您的示例中,长度大于密钥的密码未完全异或,因此部分明文保持可见。如果多个密码共享同一个密钥,破解成本非常低。这种“加密”也很容易受到例如明文攻击。为了存储密码,应该使用更复杂的散列算法。有特殊的密码散列算法,如bcryptPBKDF2

于 2013-09-24T13:48:21.220 回答