我正在玩 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