在 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到寄存器中aln0=aln100%Pln100/snlbx到寄存器中bA0D68736142sn,将 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 的内容( ) (放入堆栈顶部)nln100(它是十六进制)放在堆栈顶部%将堆栈顶部的两个数字取模(因此:)$n % 0x100并将其放在堆栈顶部chr($stack))ln再次取数字$n(再次,它来到堆栈的顶部)100入栈_/将堆栈中的数字除以(结果进入顶部)sn将堆栈存储到$n(替换原始编号)lbx- 如上所述 - 评估寄存器 b所以,简而言之:
0xA0D68736142存储在 中的数字$n,0x100通过获取最后两位数对其取模,将其转换为 ascii 并打印,0x100(删除最后两位数) - 并将其存储到$n0xA0D68736142你会得到(使用man ascii)
42-B61-a73-s68-h0D-\rA(作为 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是一件奇怪的事情——在创建一个“程序”时,它更容易阅读和理解。:)