如何匹配密钥与明文1D数组字符到Vigenere密码2D矩阵实现加密
维吉尼亚密码矩阵匹配加密解决方案
核心实现逻辑
你提到的字符转数字索引的方案实际实现非常简便,Java中char类型本质是ASCII码数值,大写英文字母直接减去'A'即可直接得到0-25的对应索引,无需额外映射逻辑,仅需一行代码即可完成转换,完全不存在繁琐的问题。
你的arrayTabula矩阵第一维(行)对应密钥的Y轴,第二维(列)对应明文的X轴,直接通过索引取交叉值即可得到密文字符。
代码示例
假设你已经提前生成好维吉尼亚矩阵、等长密钥数组、明文字符数组,加密逻辑参考如下:
// 提前准备好的三个输入 char[][] vigenereMatrix = arrayMatrix(); char[] plainTextArray; // 读取txt得到的明文字符数组 char[] keyArray; // 扩展到和明文等长的密钥数组 // 生成密文数组 char[] cipherTextArray = new char[plainTextArray.length]; for (int i = 0; i < plainTextArray.length; i++) { // 密钥字符转Y轴行索引 int yIndex = keyArray[i] - 'A'; // 明文字符转X轴列索引 int xIndex = plainTextArray[i] - 'A'; // 直接取矩阵交叉点作为密文字符 cipherTextArray[i] = vigenereMatrix[yIndex][xIndex]; }
效果验证
用你给出的示例验证:密钥首字符为R,R - 'A'得到行索引17;明文首字符为C,C - 'A'得到列索引2,取vigenereMatrix[17][2]即可得到密文首字符T,和预期结果一致。
其他方案说明
如果完全不想做字符转数值的操作,也可以通过遍历矩阵行首、列首匹配对应字符的方式定位位置,但该方案每个字符都要最多遍历26次找行、26次找列,时间复杂度远高于上述ASCII转换方案,没有实际使用必要。
内容的提问来源于stack exchange,提问作者Andich
相关产品推荐
相关产品推荐

