Java编写仿射密码暴力破解程序输出异常问题求解
问题修复方案
根本原因
解密计算环节的括号优先级错误,导致b值错误作用在字符ASCII码而非字母表索引上:
原代码中alphabet.indexOf((str.charAt(k)) - j)的写法是先将字符的ASCII值减b(即变量j),再查找对应的字母表索引。当b值增大后,str.charAt(k) - j的结果会超出小写字母的ASCII范围,indexOf直接返回-1,后续运算就会持续得到对应字符z的索引25,这就是输出逐渐被单一字母占满的原因。
需修正的两处错误
- 调整解密公式的计算顺序:先取字符在字母表中的索引,再减去b值
- 修正b值的循环范围:b的合法取值是0~25,原循环
j < 25遗漏了b=25的情况
修正后的核心代码
// 把原来的解密计算行替换为以下逻辑 int y = alphabet.indexOf(str.charAt(k)); int aInv = MultiInverse.modInverse(aValues[i], 26); int num = Math.floorMod(aInv * (y - j), 26); insert.append(alphabet.charAt(num)); // b值循环调整为 for (int j = 0; j < 26; j++) {
修正后运行即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

