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 0x61h 是 ASCII 0x68。异或在一起,它们产生一个标签:

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

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

【讨论】:

感谢您的帮助。但解决方案是在 PHP 中将 H32 更改为 H* @Tycho:这不可能是您示例的全部解决方案。 $password ^ $newchal 与 PHP 中的 $password.''.$newchal 非常不同 AND 在 Perl

以上是关于Perl 中的 ^ 运算符有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的箭头运算符“->”有啥作用?

Haskell GLUT 库中的 ($=)(美元等于)运算符有啥作用?

C# 中的“>>”运算符有啥作用?

逗号运算符有啥作用?

^= 运算符有啥作用?

% 对 Python 中的字符串有啥作用?