我有一个生成随机密码字母表的分配,然后加密和解密用户输入的消息。加密和输入正在工作时,解密正在返回错误的消息。经过进一步调查,我发现这是因为我的混乱密码字母表有重复。我尝试通过提供" swapped = true"来修复重复错误。不替换已经洗牌过的字母的方法。然而,这只是增加了漏洞,因此我删除了它。下面是我返回重复项的方法的代码。
public static char[] cipherAlphabet(char[] alpha)
{
Random rand = new Random();
char[] newAlpha = new char[26];
char current;
int index;
for (int i = 0; i < alpha.length; i +=1)
{
index = rand.nextInt(alpha.length);
newAlpha[i] = alpha[index];
newAlpha[index] = alpha[i];
}
return newAlpha;
}
当我输入消息时
sample message
这将返回加密
Encrypted Message: WUFKRJ FJWWUMJ
和
的解码消息 samcle message
我不确定为什么这是一个字母,但我的字母表肯定有问题,因为它看起来像这样。
Regular Alphabet: abcdefghijklmnopqrstuvwxyz
Cipher Alphabet: ulktjvmihqyrfxnkjlwdzwvzkx
TWO Ws and Js ^ ^
任何有关去哪里或代码的帮助都会受到赞赏。
编辑:对于建议使用Collections.shuffle()的人,我需要使用Random进行此分配。
答案 0 :(得分:2)
您错误地实施了交换逻辑。这样:
index = rand.nextInt(alpha.length);
newAlpha[i] = alpha[index];
newAlpha[index] = alpha[i];
使i
和index
值都等于index
元素。要交换它们,您必须引入临时变量,如下所示:
index = rand.nextInt(alpha.length);
int tmp = newAlpha[i];
newAlpha[i] = alpha[index];
newAlpha[index] = tmp;
答案 1 :(得分:0)
我建议这样的解决方案:
static Random rand = new Random();
public static char[] cipherAlphabet(char[] alpha) {
// copy of alpha
char[] copy = Arrays.copyOf(alpha, alpha.length);
// linear time O(n)
for (int i = 0; i < alpha.length; i += 1) {
// random index
int j = rand.nextInt(alpha.length);
// swap
char temp = copy[j];
copy[j] = copy[i];
copy[i] = temp;
}
return copy;
}
这个算法只需n步,其中n是字母表的长度。
在每次迭代中,您都会生成随机的新索引(j), 然后交换第i和第j个元素。
无论您执行多少次互换,字母表都没有重复。