【问题标题】:Assembly Vigenère cipher program汇编 Vigenère 密码程序
【发布时间】:2016-08-11 03:31:40
【问题描述】:

我不太确定如何解决这个问题:

为了获得更好的频率特性,关键字不应有任何重复 字母。此外,如果它包含字母 A,则加密的字母将与明文相同,尽管这不一定是坏事。 为了用铅笔和纸来实现这个算法,许多描述要求你建立一个维吉尼亚广场。但是,当您使用计算机进行编码和解码时,这并不是必需的。 本质上,关键字是在明文之上一遍又一遍地重复写入的。

假设关键字是 CRYPTOGRAM。

CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR 我们已经被人欺骗了,我们发现了飞行时间遇见USBYTHEOLDTREEATNINEPM

考虑字母编号为 0 到 25。顶部的字母决定 下面的字母使用哪个凯撒密码。因此,C 表示将字母表移位 2,A 表示移位 0,依此类推。在数学术语中,我们将这两个字母加在一起以取模 26。(使用平方是因为 1553 年的士兵还没有普遍理解模算术的概念。)

要解密消息,反向执行相同的操作。那就是 关键字字母的值被减去而不是被添加。第三步:你的代码应该做什么

  1. 您的代码应使用 STDIN 和 STDOUT 进行输入和输出。 (这是 默认值。)在命令行上使用重定向来读取文件并写入 文件。

  2. 您的代码应该打开一个文件,逐个字符读取文件并将其保存到 数组。

  3. 当您到达文件末尾时,您应该对文件的内容进行编码 使用关键字 CRYPTOGRAM 的 Vigenère 密码数组,然后打印它 出来。

  4. 保持区分大小写字母,并做 不修改非字母字符。这对安全性不是很好 你的信息,但结果会看起来更整洁。

  5. 这个程序应该使用 glibc 函数。除了 printf(),你还可以 需要 getchar() 和 putchar()。

  6. 假设输入文件只包含 ASCII 文本 不要担心什么 发生在非文本文件中。

  7. 编码器工作后,通过复制代码和 将加法改为减法。

  8. 如果使用 printf() 输出数组,请记住空终止是 字符串需要。

【问题讨论】:

  • 首先将问题分解为较小的部分,例如“从stdin读取输入”、“加密字符串”、“加密字符”、“将输出打印到标准输出”。
  • 该问题被标记为cassembly。问题中没有迹象表明需要汇编语言。所有对代码的引用都提到了标准的 c 函数。
  • @KlasLindbäck 所说的,与任何复杂任务一样。把它分开。它似乎已经被部分拆分了,所以你对哪个子任务有问题?
  • 注意:不回复会将您的问题关闭为“不清楚”,回复“所有这些”会将其关闭为“广泛”。恐怕我们会在 SO 上遇到很多无谓的家庭作业垃圾,试图让他们的所有作业(或其他学生的作业)免费完成,同时自己几乎不费力,所以我们必须小心我们不会被滥用于此类目的。

标签: c arrays assembly x86 nasm


【解决方案1】:

首先将问题分解为更小的部分,例如“从stdin 读取输入”、“加密字符串”、“将输出打印到标准输出”。

您需要熟悉取模运算符,因为您需要在程序中多次使用它。

如果您遇到困难,这是解决问题的一种方法 (还有其他同样好的方法):

/* For printf, getchar etc: */
#include <stdio.h>
/* For isalpha, isupper, islower etc: */
#include <ctype.h>

char encryptChar(char ch, char cypher) {
    int shiftBy = cypher - 'A';
    char encryptedLetter;

    /* There are 3 cases: uppercase, lowercase, other char */
    if (isupper(ch)) {
        /* add code to encrypt uppercase char */
    } else if (islower(ch)) {
        /* add code to encrypt lowercase char */
    } else {
        /* Other characters stay as they are */
        encryptedLetter = ch;
    }
    return encryptedLetter;
}

char *cypherString = "CRYPTOGRAM";

int main(int argc, char **argv) {
    int ch;
    int cypherStringLength = strlen(cypherString);
    int counter = 0;
    char cypher;

    while ((ch = getchar()) != EOF) {
        cypher = cypherString[counter%cypherStringLength];
        ch = encryptChar(ch, cypher);
        /* Add code to print the character */

        counter++;
    }
    return 0;
}

【讨论】:

  • 对不起我没有提到,但我必须在汇编中编写代码
  • 你还没有具体说明你的问题是什么。是算法还是汇编语言?如果是算法,那么我的回答可能会有所帮助。如果是汇编语言,那么我建议你先做几个简单的练习,然后再尝试这个。