装配Vigenère密码程序

时间:2016-04-19 06:25:42

标签: c arrays assembly x86 nasm

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

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

假设关键字是CRYPTOGRAM。

CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR WEHAVEBEENBETRAYEDALLISDISCOVEREDFLYATONCEMEETUSBYTHEOLDTREEATNINEPM

考虑字母编号为0到25.顶部的字母确定 哪个Caesar-cypher用于下面的字母。因此,C表示将字母表移动2,A表示移位0,依此类推。在数学术语中,我们将两个字母加在模26中。(使用该方格是因为1553年士兵通常不理解模运算的概念。)

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

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

  2. 您的代码应该打开一个文件,逐个字符地读取并保存到 阵列

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

  4. 保持大写和小写字母之间的区别,并且确实如此 不要修改非字母字符。这对安全性不太好 你的消息,但结果看起来更整洁。

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

  6. 假设输入文件只包含ASCII文本不用担心什么 与非文本文件一起发生。

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

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

1 个答案:

答案 0 :(得分:0)

首先在较小的部分中解决问题,例如“从stdin读取输入”,“加密字符串”,“将输出打印到stdout”。

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

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

/* 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;
}