2013-09-24 69 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