我正在尝试用 C 语言制作 Vigenere 密码,但我做了一些错误的事情,我无法修复它......如何理解出了问题?好吧,我有一些带有Vigenere密码的关键字和结果密码的示例,例如
- 关键词:
bacon
- 文本:
Meet me at the park at eleven am
- 正确结果:
Negh zf av huf pcfx bt gzrwep oz
- 我的代码结果具有相同的文本和关键字:
Tegh ne og tjs qaty bt syfvgb bm
法典:
int main(int argc, string argv[])
{
string keyWord;
if( argc != 2 )
{
printf("Wrong Argument");
return 1;
}
else
{
keyWord = argv[1];
//check if argument is
//only alphabetical characters
for(int i = 0; i < strlen(keyWord); i++)
{
char c = keyWord[i];
if( !isalpha(c) )
{
printf("Your Keyword Must Contain Only alphabetical charactersn");
return 1;
}
}
}
//todo
printf("Enter Plain Textn");
string plainText = GetString();
for(int i = 0; i < strlen(plainText); i++)
{
char c = plainText[i];
int keyWordWrapper;
char keyC;
if(isalpha(c))
{
keyWordWrapper = i % strlen(keyWord);
keyC = keyWord[keyWordWrapper];
if(islower(c))
{
int key = keyC - 'a';
c = (c - 'a' + key) % 26 + 'a';
}
if(isupper(c))
{
int key = keyC - 'A';
c = (c - 'A' + key) % 26 + 'A';
}
}
printf("%c",c);
}
printf("n");
return 0;
}
GetString()
在标头中声明并在我正在使用的库中定义(就像scanf
)。
这是更新的代码
int main(int argc, string argv[])
{ 字符串关键字;
if( argc != 2 )
{
printf("Wrong Argument");
return 1;
}
else
{
keyWord = argv[1];
//check if argument is
//only alphabetical characters
for(int i = 0; i < strlen(keyWord); i++)
{
char c = keyWord[i];
if( !isalpha(c) )
{
printf("Your Keyword Must Contain Only alphabetical charactersn");
return 1;
}
}
}
string plainText = GetString();
int j;
for(int i = 0; i < strlen(plainText); i++)
{
j++;
char c = plainText[i];
int keyWordWrapper;
char keyC;
if(j > strlen(keyWord))
j = 0;
if(isalpha(c))
{
keyWordWrapper = i % strlen(keyWord);
keyC = keyWord[keyWordWrapper];
int key;
tolower(c);
if(islower(keyC))
key = keyC - 'a';
if(isupper(keyC))
key = keyC - 'A';
c = (c - 'a' + key) % 26 + 'a';
}
printf("%c",c);
}
printf("");
返回 0;}
代码中有两个问题。
首先是关键字中大写字母的处理。 请注意,在一种情况下,代码从 keyC 中减去a
,而在另一种情况下,A
减去。 但这是基于纯文本字符的情况。 该减法需要基于关键字中字母的大小写。
其次,代码前进到纯文本中每个字符的关键字中的下一个字符。 如果纯文本字符是space
字符,则"正确结果"不会前进到关键字的下一个字符。
这是我为第二个问题谈论的示例
text Meet me at
keyC baco nb ac
i 0123456789 i must always increment to the next char in plain text
k 0123 40 12 index into the keyword does not increment on non-alpha
因此,不能直接从i
计算k
keyWordWrapper = i % strlen(keyWord);
相反,k
需要初始化为 0
,然后仅在纯文本包含字母字符时才递增。 下一行将计算关键字的正确索引。
keyWordWrapper = k % strlen(keyWord);
唯一的区别是i
被替换为k
,并且k
仅在纯文本具有字母字符时才递增。
您应该将键转换为全部小写(或全部大写),然后在两个 shift 块中使用相同的表达式:
int key = keyC - 'a'; // Or 'A' if you convert to upper
您应该从for
循环的条件中删除strlen(plainText)
;它将线性算法转换为二次算法。