好吧,这就是我现在所拥有的,它几乎是正确的,但不会循环文本,如果 key 有大写,它也会变得困惑:-/任何提示或线索都会很棒,我不明白 key_of_the_key bcz 我'我从来没有见过我所看到的都是strlen
#define LMIN 97
#define LMAX 122
#define UMIN 65
#define UMAX 90
#define ALPHANUM 25
int main(int argc, string argv[])
{
int i, j, n;
string pt = GetString();
string key = argv[1];
for(i = 0, j = 0, n = strlen(pt); i < n; i++, j++)
{
if(pt[i] >= LMIN||pt[i] == LMAX){
pt[i] = ((pt[i] - LMIN) + (key[j] - LMIN)) % 26;
pt[i] += LMIN;
printf("%c", pt[i]);
}
else if (pt[i] >= UMIN||pt[i] == UMAX){
pt[i] = ((pt[i] - UMIN) + (key[j] - UMIN)) % 26;
pt[i] += UMIN;
printf("%c",pt[i]);
} else{
printf("%c", pt[i]);
}
}
}
最佳答案
我假设您熟悉 Vigenère cipher 如何作品。当关键短语比明文短时,它的字母会重复,直到形成相同长度的字符串,从而可以为每个明文字母计算凯撒位移。
在 C 代码中,key[k % size_of_the_key]
使用递增变量 k
依次访问关键短语的每个部分。 modulus operator (%
) 确保当 k
增加超过关键短语的长度时,字母会根据需要循环多次。
如果您正在构建自己的程序,则可以使用对 strlen()
的简单调用来获取关键短语的长度。但是,在您发布的代码中,关键短语必须转换为 0 到 25 之间的值数组 (key[]
)。
您还应该尝试使您的代码能够使用大小写字母;看起来它只会转换当前形式的大写字母。
关于c - 维吉尼亚密码。键的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904381/