1

好的,第一次发帖。。

所以我有这个任务来手动解密密码,但我也想把这个过程自动化一点,如果不是全部的话,至少有几个部分,所以我四处浏览,找到了一些 sed 和 awk 一个衬垫来做一些我想做的事情,但不是我想要/需要的全部。

有一些网站可以做我想做的事,但出于某种原因,我真的只想在 bash 中做,只是因为我想更好地理解它等等 :)

该脚本将文件名作为参数并输出另一个文件,例如solution$1完成时。

if [ -e "$PWD/$1" ]; then
 echo "$1 exists"
else
  echo "$1 doesnt exists"   
fi

将启动脚本以查看参数中的文件是否存在..

然后我找到了这一个班轮

sed -e "s/./\0\n/g" $1 | while read c;do echo -n "$c"  ; done

哪个工作正常,但我需要每个字母出现的次数,我真的不知道该怎么做。

这是我试图实现或多或少的http://25yearsofprogramming.com/fun/ciphers.htm以计算唯一字母的出现次数等。

然后我需要把所有字母都小写。

在此之后,我看到脚本在做这些事情.. - 一个下标,用于扫描字典文件以查找特定模式和单词大小,单词越大越好。例如:假设解决方案是单词“apparel”,加密单词是“zxxzgvk”是否有正则表达式来表示比较这两个单词并在字典文件中列出单词“apparel”的模式,因为“appa”和“zxxz”是相似的模式,“zxxzgvk”的长度与“apparel”相似

  1. 这可以部分完成吗?这样看待问题是否现实,或者这只是牵强附会?

    • 另一个下标,它从前一个输出单词中获取找到的字母并交换密码中的字母。

交换后的字母将采用大写字母,以便随着时间的推移将它们区分开来。

我必须弄清楚如何继续重新扫描新找到的单词,看看它们是否部分或全部在字典文件中找到,然后交换更多字母。

  1. 过去有没有人看到这个问题并试图用我描述的文字模式来解决它,或者这太复杂了?

  2. 我应该记录任何交换吗?

也许只是扫描所有加密的单词并在我继续进行时进行交换,然后在第一次扫描时使用 for 约束进行另一次扫描以不更改大写字母(实际上是将它们用作更精确的模式..!)

有人用另一种语言做过类似的脚本/程序吗?如果有,是哪一个?也许我可以以某种方式联系:)

也许我们可以利用您的洞察力来了解您是如何构思代码的。

我很乐意将我已解码的密码和尚未解码的密码包括在内:)

同样,我的任务重点不是编写此脚本,而只是解决密码问题。但是编写脚本或者至少尝试看看我将如何编写这个脚本确实可以帮助我更多地理解如何从代码的角度思考。请随时指出我正确的方向!

密码本身是基于简单的字母替换。

我在这里做了一个pastebin,代码是:) http://pastebin.com/UEQDsbPk

在伪代码中,我看到的是:

  • 使用参数中的输入文件名和可选的第二个文件名(字典)调用程序
  • 验证输入文件是否存在且不为空
  • 读取文件内容并在屏幕上回显
  • 转换为小写
  • 扫描文本并计算每个字母的数量以进行频率分析
  • 询问用户文本应该是什么语言(英语默认)
  • 使用响应来指定用作基线的字母频率
  • 交换对应于大写频率分析的字母。
  • 在屏幕上打印更改的文档
  • 要求用户交换加密文本中的字母
  • 如果用户将字典文件作为第二个参数
  • 然后扫描密码以查找单词并找到更大的单词
  • 在字典文件中查找具有相似模式的单词(一些字母重复字母)
  • 在屏幕上列出结果(如果有)
  • 提议交换密码中对应的字母
  • 在屏幕上打印修改后的密码
  • 再次要求交换字母或找到更多相似的单词

或多或少是我看到脚本结构的方式。

  1. 你有没有看到我应该添加的东西,我错过了什么吗?

我希望这个修订版对大家来说更清楚!

4

2 回答 2

1

坦率地说。对于我发现的唯一问题 - 答案是肯定的:) 请将其拆分为较小的任务,我们很乐意为您提供帮助 - 如果您以前找不到这些较小问题的答案。

如果你能把它写成伪代码,那就更容易了。unix 中有各种各样的文本操作。使用的方法取决于你的文本有多大。我相信它们并没有那么大,否则你会使用一些编译语言。

例如,计算频率的简单但昂贵的笨方法:

awk -F "" '{for(i=1;i<=NF;i++) freq[$i]++;}END{for(i in freq) printf("%c %d\n", i, freq[i]);}'

至于音译,有tr功用。您可以伪造然后将每种情况下的实际字符串传递给它(这对于类似凯撒的密码来说是正确的)。

于 2011-02-15T08:24:11.070 回答
1
grep -o . inputfile | sort | uniq -c | sort -rn

例子:

$ echo 'aAAbbbBBBB123AB' | grep -o . | sort | uniq -c | sort -rn
  5 B
  3 b
  3 A
  1 a
  1 3
  1 2
  1 1
于 2011-02-15T11:44:28.563 回答