我不确定如何解决这个问题:
为了获得更好的频率特性,关键字不应重复 字母。此外,如果它包含字母A,加密的字母将与明文相同,尽管这不一定是坏事。 要用铅笔和纸来实现这个算法,许多描述要求你建立一个Vigenère广场。但是,当您使用计算机进行编码和解码时,这并不是必需的。 本质上,关键字是在明文上方重复写的。
假设关键字是CRYPTOGRAM。
CRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGRAMCRYPTOGR WEHAVEBEENBETRAYEDALLISDISCOVEREDFLYATONCEMEETUSBYTHEOLDTREEATNINEPM
考虑字母编号为0到25.顶部的字母确定 哪个Caesar-cypher用于下面的字母。因此,C表示将字母表移动2,A表示移位0,依此类推。在数学术语中,我们将两个字母加在模26中。(使用该方格是因为1553年士兵通常不理解模运算的概念。)
要解密消息,请执行相反的操作。那就是 减去关键字字母的值而不是添加。第3步。您的代码应该做什么
您的代码应使用STDIN和STDOUT进行输入和输出。 (这是 默认。)使用命令行上的重定向从文件中读取并写入 文件
您的代码应该打开一个文件,逐个字符地读取并保存到 阵列
当你到达文件的末尾时,你应该编码的内容 使用关键字CRYPTOGRAM的Vigenère密码数组,然后打印它 进行。
保持大写和小写字母之间的区别,并且确实如此 不要修改非字母字符。这对安全性不太好 你的消息,但结果看起来更整洁。
该程序应使用glibc函数。除了printf(),你可以 需要getchar()和putchar()。
假设输入文件只包含ASCII文本不用担心什么 与非文本文件一起发生。
编码器工作后,通过复制代码和构建解码器 将加法更改为减法。
如果使用printf()输出数组,请记住空终止 在字符串上需要。
答案 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;
}