tr 和 rot13 问题

tr 和 rot13 问题

我正在玩 OverTheWire 的 Bandit。在第 11 阶段,他们要求您使用此明文翻译数据文件"Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"。我知道解决方案是使用这个命令。

`tr 'A-Za-z' 'N-ZA-Mn-za-m' <<< "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"`

但是,我不明白为什么以下选项不起作用:

`tr 'A-Za-z' 'Z-Az-a'`

或者

`tr ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba <<<"Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"`

我相信第一个例子与 tr 将 za 和 ZA 的范围视为无效有关。为什么是这样?

至于第二个例子,为什么命令输出

Tfi xmuuqyvj eu 5Ti8O4jvgKVhKp8sgjqsIP8CHK6c2ISs

而不是正确的答案:

The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

答案1

ROT13 将字母表移动 13 个位置,例如 A 和 N 交换位置,B 和 O 也交换位置,依此类推。它不会颠倒字母表,而这正是您的尝试正在做的事情。

语法tr可能会稍微混淆此操作。您发布的 ROT13 编码器/解码器可以这样写,以便更清楚地了解正在发生的事情:

tr 'A-MN-Za-mn-z' \
   'N-ZA-Mn-za-m' \
<<< ciphertext

在这里您可以更好地看到相应的字母范围如何相互关联。

答案2

tr 'A-MN-Za-mn-z' 'N-ZA-Mn-za-m'可能在 50 年前还有效,但自 1992 年 UNIX 引入国际化以来,它就不再有效了。

查看:

$ echo Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XS | /usr/xpg4/bin/tr 'A-MN-Za-mn-z' 'N-ZA-Mn-za-m'

输出(取决于实际区域设置)例如:

vFè pÂÛÛAøßé ÌÛ 5vè8À4éßËEtêEá8VËéAVÈÁ8jÊ

为什么会出现这种情况?

原因是该范围N-Z包含超过 13 个字符,例如Ö, Ü, ...,因此,当使用tr正确实现排序的实现时,正确指定 rot13 的唯一方法是使用:

tr ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

相关内容