2013-09-24 72 views
1

情况在Perl^运算符在Perl中做什么?

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

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

监守我送这个密码需要正确的编码..上面这个方法是从一个标准的脚本RADIUS服务器,这是非常重要的。

现在在PHP我想:

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

我比较了outcoming但它是不同的。我想不出什么“^”在Perl手段。 任何人都可以帮我吗?

+0

[参考 - 这个符号在PHP中意味着什么?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) –

回答

2

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

有关更多信息,请阅读文档PHPPerl

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

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

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

E.g. a是ASCII 0x61,而h是ASCII 0x68。异或在一起,它们会产生一个标签:

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

按位异或有时用于可逆的“加密”,但这一招是众所周知的,而且相当不安全。例如。在你的例子中,长度更长的密码然后密钥不完全异或,所以明文的一部分保持可见。如果同一个密钥共享多个密码,破解非常便宜。这种“加密”也很容易受到明文攻击。为了存储密码,应该使用更复杂的哈希算法。有特殊的密码散列算法,如bcryptPBKDF2

+0

感谢帮助。但解决方案是在PHP中改变H32为H * * – Tycho

+0

@Tycho:这不可能是您的示例的完整解决方案。 '$ password^$ newchal'与'$ password'非常不同''。PHP中的$ newchal' _AND_中的Perl – cypherabe