这个维吉尼亚密码在Java中可行吗?

3

我有一个任务需要解决:在维吉尼亚密码中,我需要取消扫描器和提示。

for(int i = 0; i < text.length(); i++){
    int first = text.charAt(i);
    for(int j = 0; j < key.length(); j++){
        int second = key.charAt(j);
        int that = first + (second % 26);
        output = output + (char)that;
    }
}

我在维吉尼亚密码上的想法是使用一个for循环来捕获明文单词的每个字符。然后再用第二个for循环来捕获关键字中的每个字母。其中,明文“first”将代表字母的原始位置。关键字将代表明文字符的每个单独移位。这种做法可行吗?


请适当缩进您的代码,以便使其易读。 - Hovercraft Full Of Eels
这次我会帮你做,但是以后请自己付出这个重要的努力。 - Hovercraft Full Of Eels
解决这类问题的关键是进行实验和尝试。那么当你尝试去做时会发生什么呢? - Hovercraft Full Of Eels
@HovercraftFullOfEels遇到了麻烦,我已经做了很多尝试,各种不同的组合。问题是,如果我为文本输入A,为密钥输入A,那么在ASCII中A=65,然后我有另一个A=65的密钥,但是这个密钥是用65%26 = 13得出的,这就会将原始的A推向ASCII表上的N,这是有意义的。但是对于其他字母并非如此,我无法弄清楚为什么。 - Kissamer
首先,您需要确保字符从A=0,B=1等开始,然后才能执行模算术。当前,如果second%26= 25,则first +(second%26)可能超出范围。 - Maarten Bodewes
1个回答

0
你的问题在于有两个循环,但你应该只有一个循环。
不要使用键的循环,而是使用键长度的模运算来为该迭代提供移位。
修复逻辑(并为变量取合理的名称):
for (int i = 0; i < text.length(); i++){
    int letter = text.charAt(i);
    int shift = key.charAt(i % key.length()) - 'A';
    int encrypted = (letter + shift) % 26 + 'A';
    output = output + (char)encrypted;
}

这段代码与你的代码的主要区别在于表达式i % key.length(),它不断循环遍历密钥中的字母以确定每个字母的移位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接