在 TLDP 上阅读此页面:http ://www.tldp.org/LDP/abs/html/mathc.html
我找到了以下命令:
bash$ echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D68736142snlbxq" | dc
Bash
我只是想知道:有人知道那是什么类型的哈希,以及我如何转换简单的文本来生成那种哈希?
谢谢
在 TLDP 上阅读此页面:http ://www.tldp.org/LDP/abs/html/mathc.html
我找到了以下命令:
bash$ echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D68736142snlbxq" | dc
Bash
我只是想知道:有人知道那是什么类型的哈希,以及我如何转换简单的文本来生成那种哈希?
谢谢
比较好的教程在这里。使用它,您将获得下一个分解:
16i
- 输入将是十六进制(如bc
- ibase=16
)[q]
-[..]
平均字符串。所以这会将一个字符串存储q
到堆栈的顶部。通常[....]
是存储以供以后执行的一系列命令(如宏),在这种情况下是命令q
- 退出。s
- 取栈顶并将其存储到由下一个字母标识的寄存器中,所以在[q]sa
这种情况下,一起意味着:将字符串存储q
到寄存器中a
ln0=aln100%Pln100/snlbx
到寄存器中b
A0D68736142sn
,将 intA0D68736142
存入寄存器n
。在这种情况下不是字符串,而是因为我们输入了十六进制,所以这是一个十六进制数以上是一个类似的准备阶段,翻译成通用编程语言:
$a = "q";
$b = "ln0=aln100%Pln100/snlbx";
$n = 0xA0D68736142";
堆栈现在是空的(所有内容都存储在注册表中)。
接下来是最终的计算:
l
平均值从后面的寄存器中获取值,并将其放入堆栈顶部,因此平均值lb
:获取寄存器的值b
。x
它作为一系列命令执行 - 在这种情况下,将其读作eval "$b";
q
意思是放弃现在需要分解ln0=aln100%Pln100/snlbx
(寄存器的内容b
- 什么是eval -ing。)
ln
- 如上所述,n
在我们的例子中从寄存器中取值:hexa-number0=a
,取栈顶,如果它zero
执行存储在注册表“a”中的字符串(宏)(在我们的例子中这是一个“q” - 退出),例如:if( $n == 0 ) eval "a"; #a contains "q" = quit
$n
获取 regsiter 的内容( ) (放入堆栈顶部)n
ln
100
(它是十六进制)放在堆栈顶部%
将堆栈顶部的两个数字取模(因此:)$n % 0x100
并将其放在堆栈顶部chr($stack)
)ln
再次取数字$n
(再次,它来到堆栈的顶部)100
入栈_/
将堆栈中的数字除以(结果进入顶部)sn
将堆栈存储到$n
(替换原始编号)lbx
- 如上所述 - 评估寄存器 b所以,简而言之:
0xA0D68736142
存储在 中的数字$n
,0x100
通过获取最后两位数对其取模,将其转换为 ascii 并打印,0x100
(删除最后两位数) - 并将其存储到$n
0xA0D68736142
你会得到(使用man ascii
)
42
-B
61
-a
73
-s
68
-h
0D
-\r
A
(作为 0A) -\n
用 perl 从普通的 ascii 字符串创建这样的 hexsting
perl -E '$s=reverse("Bash\r\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'
印刷
0A0D68736142
或者
perl -E '$s=reverse("Stackoverflow rocks\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'
0A736B636F7220776F6C667265766F6B63617453
和
echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sb0A736B636F7220776F6C667265766F6B63617453snlbxq" | dc
印刷:
Stackoverflow rocks
Ps:withdc
是一件奇怪的事情——在创建一个“程序”时,它更容易阅读和理解。:)