我试图在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 characters\n");
return 1;
}
}
}
//todo
printf("Enter Plain Text\n");
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[])
{ 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 characters\n");
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(&#34; \ n&#34);
返回0; }
答案 0 :(得分:2)
代码中存在两个问题。
首先是关键字中大写字母的处理。请注意,在一种情况下,代码会从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
因此k
无法使用
i
计算keyWordWrapper = i % strlen(keyWord);
k
相反,0
需要初始化为keyWordWrapper = k % strlen(keyWord);
,然后仅在纯文本包含字母字符时才会递增。以下行将计算关键字的正确索引。
i
唯一的区别是k
被k
取代而{{1}}仅在纯文字具有字母字符时递增。
答案 1 :(得分:0)
您应该将密钥转换为全部小写(或全部大写),然后在两个shift块中使用相同的表达式:
int key = keyC - 'a'; // Or 'A' if you convert to upper
您应该从strlen(plainText)
循环的条件中删除for
;它将线性算法转换为二次算法。