Java 密码字母的自定义数组洗牌中的重复项

Java 密码字母的自定义数组洗牌中的重复项,java,encryption,Java,Encryption,我的任务是生成一个随机密码字母表,然后对用户输入的消息进行加密和解密。当加密和输入工作时,解密返回错误的消息。经过进一步的调查,我发现这是因为我的混合密码字母表有重复。我试图通过提供一个“swapped=true”方法来修复重复错误,该方法不替换已被洗牌的字母。然而,这只是增加了漏洞,因此我删除了它。下面是返回重复项的方法的代码 public static char[] cipherAlphabet(char[] alpha) { Random rand = new Random();

我的任务是生成一个随机密码字母表,然后对用户输入的消息进行加密和解密。当加密和输入工作时,解密返回错误的消息。经过进一步的调查,我发现这是因为我的混合密码字母表有重复。我试图通过提供一个“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;
}
这将返回对数据的加密

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
的索引,然后单击“确定”,谢谢您的帮助,其他答案也会解决此问题。赞成票:)。