我不太清楚该如何处理这个问题:
为了获得更好的频率特性,关键字不应该有任何重复字母。此外,如果它包含字母A,加密的信函将与明文相同,尽管这并不一定是一件坏事。要用铅笔和纸来实现这个算法,许多描述都要求您构建一个Vigenère Square。但是,当您使用计算机进行编码和解码时,这并不是真正必要的。从本质上讲,关键字是在纯文本之上反复写的。
假设关键字是密码。
假设字母编号为0到25。顶部的字母决定下面的字母使用哪一种凯撒密码。因此,C表示将字母表移2,A表示移0,依此类推。在数学上,我们把这两个字母相加在一起,模26。(之所以使用正方形,是因为1553年士兵并不普遍理解模块化算术的概念。)
若要解密消息,则执行相同的操作。也就是说,关键字字母的值是减去而不是添加的。步骤3.您的代码应该做什么
发布于 2016-04-19 07:24:55
首先,将问题分解成较小的部分,如“从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;
}https://stackoverflow.com/questions/36710175
复制相似问题