我的任务是生成随 secret 码字母表,然后对用户输入的消息进行加密和解密。当加密和输入工作时,解密返回错误的消息。经过进一步调查,我发现这是因为我的打乱的密码字母表有重复。我尝试通过提供“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 来进行此分配。
最佳答案
您错误地实现了交换逻辑。这:
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;
关于java - 密码字母表的自定义数组洗牌中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073890/