我发现了一个可以使用以下命令解密的混淆电子邮件地址:
echo "cbyrzba@cbyrzba.bet" | tr '[a-z]' '[n-za-m]'
Run Code Online (Sandbox Code Playgroud)
这如何输出有效的电子邮件地址?那个命令在做什么?
Mic*_*zek 22
tr
的手册页很好地解释了它;它是一种将字符从一组转换为另一组的过滤器。指定的第一组是[a-z]
,这是键入的速记方式[abcdefghijklmnopqrstuvwxyz]
。第二个是[n-za-m]
,变成[nopqrstuvwxyzabcdefghijklm]
。tr
从标准输入读取每个字符,如果它出现在第一组中,它会用第二组中相同位置的字符替换它(这意味着[
并且]
正在被自己替换,所以包括它们是没有意义的,但是很多人这样做是错误的,因为正则表达式使用它们来表示字符类,所以他们认为tr
需要它们)。
所以一个更简单的例子:
$ echo abc | tr ab xy
xyc
Run Code Online (Sandbox Code Playgroud)
a
变成x
,b
变成y
,并c
保持不变,因为它不在第一组中。在这种情况下,用户所做的所有操作都是通过相同的过滤器运行他们的电子邮件地址(因为它是对称的——a
映射到n
和n
返回到a
等)以获得旋转版本;你再次运行它会将所有字符交换回它们的原始字符
旁注:这种特殊的交换,其中每个字母都被字母表中远离它的 13 个字符替换,称为ROT13(旋转 13);它在新闻组中很受欢迎,作为一种隐藏人们可能不想看到的东西的方式
tr
音译字符:对于输入中的某个字符 x,它输出一个字符 y。
tr
接受两个命令行参数,“from”字符和“to”字符。
在上面的示例中,“来自字符”给出为'[a-z]'
. “到字符”给出为'[n-za-m]'
。单引号使解释命令行的 shell 不对两个参数执行任何操作。tr
将方括号参数视为范围。所以'[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated,
'[n-za-m]'` 的意思是“从 'n' 到 'z' 的小写字符,以及从 'a' 到 'm' 的小写字符,包括'。
tr
将所有输入的 'a' 字符音译为 'n'、'b' 到 'm'、'c' 到 'o' 等,最多将 'n' 个字符输出为 'z'。输入中的 'o' 字符输出为 'a'、'p' 到 'b'、'q' 到 'c' 等等。输入中的 'z' 字符输出为 'l'。
本质上,您的命令对其输入执行凯撒密码,一次一个小写字符。有人必须加密“polemon@polemon.org”才能获得您echo
输出的字符串。