首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装配Vigenère密码程序

装配Vigenère密码程序
EN

Stack Overflow用户
提问于 2016-04-19 06:25:42
回答 1查看 1.3K关注 0票数 0

我不太清楚该如何处理这个问题:

为了获得更好的频率特性,关键字不应该有任何重复字母。此外,如果它包含字母A,加密的信函将与明文相同,尽管这并不一定是一件坏事。要用铅笔和纸来实现这个算法,许多描述都要求您构建一个Vigenère Square。但是,当您使用计算机进行编码和解码时,这并不是真正必要的。从本质上讲,关键字是在纯文本之上反复写的。

假设关键字是密码。

假设字母编号为0到25。顶部的字母决定下面的字母使用哪一种凯撒密码。因此,C表示将字母表移2,A表示移0,依此类推。在数学上,我们把这两个字母相加在一起,模26。(之所以使用正方形,是因为1553年士兵并不普遍理解模块化算术的概念。)

若要解密消息,则执行相同的操作。也就是说,关键字字母的值是减去而不是添加的。步骤3.您的代码应该做什么

  1. 您的代码应该使用STDIN和STDOUT作为输入和输出。(这是默认的。)在命令行上使用重定向从文件中读取并写入文件。
  2. 您的代码应该打开一个文件,逐字符读取它,并将它保存到一个数组中。
  3. 当您到达文件的末尾时,您应该使用关键字密码用Vigenère密码对数组的内容进行编码,然后打印出来。
  4. 保持大写字母和小写字母之间的区别,不修改非字母字符.这对您的消息的安全性不是很好,但是结果看起来会更整洁。
  5. 这个程序应该使用glibc函数。除了printf(),您可能需要getchar()和putchar()。
  6. 假设输入文件只包含ASCII文本,不要担心非文本文件会发生什么。
  7. 编码器工作后,通过复制代码并将加法更改为减法来构建解码器。
  8. 如果使用printf()输出数组,请记住字符串上需要空终止。
EN

回答 1

Stack Overflow用户

发布于 2016-04-19 07:24:55

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

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

如果您遇到了困难,这里有一个解决问题的方法(还有其他方法也一样好):

代码语言:javascript
复制
/* 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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36710175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档