Perl 中的 ^ 运算符有啥作用?
Posted
技术标签:
【中文标题】Perl 中的 ^ 运算符有啥作用?【英文标题】:What does the ^ operator do in Perl?Perl 中的 ^ 运算符有什么作用? 【发布时间】:2013-09-24 13:46:27 【问题描述】:perl中的情况
$password = 'admin';
$newchal = 'hnfdfhj238478wdehf';
$password2 = unpack "H32", ($password ^ $newchal);
这非常重要,因为我将此密码发送到需要正确编码的 radius 服务器。上面的这个方法来自标准脚本。
现在我在 php 中尝试过:
$password2 = unpack("H32", $password.''.$newchal);
我比较了结果,但结果不同.. 我无法弄清楚 perl 中的 '^' 是什么意思。 谁能帮帮我?
【问题讨论】:
Reference - What does this symbol mean in PHP? 的可能重复项 【参考方案1】:^
是 C 派生语言(包括 Perl 和 PHP)中的按位异或 (exclusive-or) 运算符。
如需更多信息,请阅读PHP 和Perl 的文档。
当两个操作数中的一个为真时,异或运算为真。真值表是
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
当对字符串使用按位异或时,二进制表示的每个位都被异或在一起。
例如a
是 ASCII 0x61
,h
是 ASCII 0x68
。异或在一起,它们产生一个标签:
a (61): 01100001
h (68): 01101000
\t (09): 00001001
按位异或有时用于可逆的“加密”,但这种技巧广为人知,而且非常不安全。例如。在您的示例中,长度大于密钥的密码未完全异或,因此部分明文保持可见。如果多个密码共享同一个密钥,破解成本非常低。这种“加密”也很容易受到例如明文攻击。为了存储密码,应该使用更复杂的散列算法。有特殊的密码散列算法,如 bcrypt 或 PBKDF2。
【讨论】:
感谢您的帮助。但解决方案是在 PHP 中将 H32 更改为 H* @Tycho:这不可能是您示例的全部解决方案。$password ^ $newchal
与 PHP 中的 $password.''.$newchal
非常不同 AND 在 Perl以上是关于Perl 中的 ^ 运算符有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章