Java 密码字母的自定义数组洗牌中的重复项
我的任务是生成一个随机密码字母表,然后对用户输入的消息进行加密和解密。当加密和输入工作时,解密返回错误的消息。经过进一步的调查,我发现这是因为我的混合密码字母表有重复。我试图通过提供一个“swapped=true”方法来修复重复错误,该方法不替换已被洗牌的字母。然而,这只是增加了漏洞,因此我删除了它。下面是返回重复项的方法的代码Java 密码字母的自定义数组洗牌中的重复项,java,encryption,Java,Encryption,我的任务是生成一个随机密码字母表,然后对用户输入的消息进行加密和解密。当加密和输入工作时,解密返回错误的消息。经过进一步的调查,我发现这是因为我的混合密码字母表有重复。我试图通过提供一个“swapped=true”方法来修复重复错误,该方法不替换已被洗牌的字母。然而,这只是增加了漏洞,因此我删除了它。下面是返回重复项的方法的代码 public static char[] cipherAlphabet(char[] alpha) { Random rand = new Random();
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;
}
这将返回对数据的加密
Encrypted Message: WUFKRJ FJWWUMJ
还有一条经过解码的
samcle message
我不知道为什么这是关闭了一个字母,但肯定有问题,我的字母表,因为它看起来像这样
Regular Alphabet: abcdefghijklmnopqrstuvwxyz
Cipher Alphabet: ulktjvmihqyrfxnkjlwdzwvzkx
TWO Ws and Js ^ ^
任何关于去哪里或编码的帮助都将不胜感激
编辑:对于建议集合的人。shuffle(),我需要使用Random来完成此任务。我建议这样的解决方案:
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;
}
static Random rand=new Random();
公共静态字符[]Ciperalphabet(字符[]alpha){
//阿尔法副本
char[]copy=Arrays.copyOf(alpha,alpha.length);
//线性时间O(n)
对于(int i=0;i
这个算法只需要n个步骤,其中n是字母表的长度
在每次迭代中,随机生成新索引(j),
然后交换第i个和第j个元素
无论您执行了多少次交换,字母表都没有重复。您错误地实现了交换逻辑。这:
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;
}
index = rand.nextInt(alpha.length);
newAlpha[i] = alpha[index];
newAlpha[index] = alpha[i];
使i
th和index
th值都等于index
th元素。要交换它们,必须引入临时变量,如下所示:
index = rand.nextInt(alpha.length);
int tmp = newAlpha[i];
newAlpha[i] = alpha[index];
newAlpha[index] = tmp;
newAlpha[i]=alpha[index];newAlpha[index]=alpha[i]代码>-这使它们具有相同的值,而不是将它们互换newAlpha
和alpha
是不同的数组newAlpha
是一个空数组,所以我用不同数组中的值填充它的索引。谢谢,我会尝试一下。然后我建议简单地将alpha
的内容复制到newAlpha
并使用我的回答提供的逻辑随机交换newAlpha
的内容。由于newAlpha
和alpha
是不同的数组,此解决方案不起作用newAlpha
是一个空数组,我用alpha
中的值填充它。此解决方案会创建更多副本。请将alpha
的内容复制到newAlpha
,然后使用上述解决方案随机交换newAlpha
的索引,然后单击“确定”,谢谢您的帮助,其他答案也会解决此问题。赞成票:)。