^运算符在Perl中做了什么?

时间:2013-09-24 13:46:28

标签: php perl pack unpack

perl中的情况

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

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

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

现在在PHP中尝试过:

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

我比较了输出,但它有所不同......我无法弄清楚'^'在perl中意味着什么。 任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

^是C派生语言中的按位XOR(exclusive-or)运算符,包括Perl和PHP。

有关详细信息,请阅读PHPPerl的文档。

当两个操作数中的一个为真时,XOR操作为真。真值表是

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

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

E.g。 a是ASCII 0x61h是ASCII 0x68。他们拼凑在一起,产生一个标签:

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

按位异或有时用于可逆“加密”,但这个技巧众所周知,而且非常不安全。例如。在您的示例中,密码长度大于密钥的密码未完全异或,因此部分明文保持可见。如果为多个密码共享相同的密钥,则破解非常便宜。这种“加密”也非常容易受到例如明文攻击。要存储密码,应使用更复杂的散列算法。有一些特殊的密码哈希算法,如 bcrypt PBKDF2