用于密码字母表的自定义数组shuffle中的重复项

时间:2018-03-02 17:01:49

标签: java encryption

我有一个生成随机密码字母表的分配,然后加密和解密用户输入的消息。加密和输入正在工作时,解密正在返回错误的消息。经过进一步调查,我发现这是因为我的混乱密码字母表有重复。我尝试通过提供" 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进行此分配。

2 个答案:

答案 0 :(得分:2)

您错误地实施了交换逻辑。这样:

index = rand.nextInt(alpha.length);
newAlpha[i] = alpha[index];
newAlpha[index] = alpha[i];

使iindex值都等于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个元素。

无论您执行多少次互换,字母表都没有重复。