【发布时间】:2016-08-11 03:31:40
【问题描述】:
我不太确定如何解决这个问题:
为了获得更好的频率特性,关键字不应有任何重复 字母。此外,如果它包含字母 A,则加密的字母将与明文相同,尽管这不一定是坏事。 为了用铅笔和纸来实现这个算法,许多描述要求你建立一个维吉尼亚广场。但是,当您使用计算机进行编码和解码时,这并不是必需的。 本质上,关键字是在明文之上一遍又一遍地重复写入的。
假设关键字是 CRYPTOGRAM。
CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR 我们已经被人欺骗了,我们发现了飞行时间遇见USBYTHEOLDTREEATNINEPM
考虑字母编号为 0 到 25。顶部的字母决定 下面的字母使用哪个凯撒密码。因此,C 表示将字母表移位 2,A 表示移位 0,依此类推。在数学术语中,我们将这两个字母加在一起以取模 26。(使用平方是因为 1553 年的士兵还没有普遍理解模算术的概念。)
要解密消息,反向执行相同的操作。那就是 关键字字母的值被减去而不是被添加。第三步:你的代码应该做什么
您的代码应使用 STDIN 和 STDOUT 进行输入和输出。 (这是 默认值。)在命令行上使用重定向来读取文件并写入 文件。
您的代码应该打开一个文件,逐个字符读取文件并将其保存到 数组。
当您到达文件末尾时,您应该对文件的内容进行编码 使用关键字 CRYPTOGRAM 的 Vigenère 密码数组,然后打印它 出来。
保持区分大小写字母,并做 不修改非字母字符。这对安全性不是很好 你的信息,但结果会看起来更整洁。
这个程序应该使用 glibc 函数。除了 printf(),你还可以 需要 getchar() 和 putchar()。
假设输入文件只包含 ASCII 文本 不要担心什么 发生在非文本文件中。
编码器工作后,通过复制代码和 将加法改为减法。
如果使用 printf() 输出数组,请记住空终止是 字符串需要。
【问题讨论】:
-
首先将问题分解为较小的部分,例如“从
stdin读取输入”、“加密字符串”、“加密字符”、“将输出打印到标准输出”。 -
该问题被标记为
c和assembly。问题中没有迹象表明需要汇编语言。所有对代码的引用都提到了标准的 c 函数。 -
@KlasLindbäck 所说的,与任何复杂任务一样。把它分开。它似乎已经被部分拆分了,所以你对哪个子任务有问题?
-
注意:不回复会将您的问题关闭为“不清楚”,回复“所有这些”会将其关闭为“广泛”。恐怕我们会在 SO 上遇到很多无谓的家庭作业垃圾,试图让他们的所有作业(或其他学生的作业)免费完成,同时自己几乎不费力,所以我们必须小心我们不会被滥用于此类目的。
标签: c arrays assembly x86 nasm