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

标签 java encryption

我的任务是生成随 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/

相关文章:

java - ArrayList删除元素

java - 如何使用 Struts2 验证打印特定的操作错误消息?

c# - 要获得 AES-256 加密,我是否只需提供 256 位 key ?

java - 使用java解密图像

java - AES 随 secret 钥生成

c++ - 为什么 CryptImportKey 失败了?

java - XQuery 使用 Saxon 9-HE 执行 Java 函数

java - 将 wsit-client.xml 中的位置导入到另一个 jar 中的文件,使用 URL 字符串在类路径上定位文件

java - Placepicker 仅在双击后工作

iphone - 如何在 iOS 5 中解密我自己的 iMessage SSL 应用程序数据?