Java实现1-10位未知长度ASCII加密密钥暴力破解的方法
实现方案
直接通过「外层遍历密钥长度+数组进位枚举组合」的逻辑实现,不需要新增任何自定义方法,完全符合你的场景要求,代码如下:
// 最外层循环遍历所有可能的密钥长度 1~10 outer: for (int keyLen = 1; keyLen <= 10; keyLen++) { // 初始化当前长度的ASCII数组,所有位默认从最小的可打印ASCII 32开始 int[] keyAscii = new int[keyLen]; for (int i = 0; i < keyLen; i++) { keyAscii[i] = 32; } while (true) { // 转成密钥字符串尝试解密 String attemptKey = main_engine.ascii_to_string(keyAscii); if (main_engine.attempt_to_decrypt_data_with_key(attemptKey)) { System.out.println("The encryption key is " + attemptKey); break outer; } // 进位逻辑,类似十进制数字加1,这里每一位的范围是32~127 int pos = keyLen - 1; while (pos >= 0) { keyAscii[pos]++; if (keyAscii[pos] < 128) { // 没有溢出,直接结束进位处理 break; } // 当前位溢出,重置为32,前进一位继续加 keyAscii[pos] = 32; pos--; } // 所有位都溢出了,说明当前长度的所有组合已遍历完,退出循环进入下一个长度 if (pos < 0) { break; } } }
逻辑说明
- 外层循环依次遍历1到10的所有可能密钥长度,优先破解短密钥,符合暴力破解的常规优先级
- 用数组存储每一位的ASCII值,通过类似数字进位的逻辑生成所有可能的组合,不需要额外写递归或者自定义生成方法
- 只要
attempt_to_decrypt_data_with_key返回true就直接跳出所有循环,输出找到的密钥
本场景无需考虑运行时长的前提下,该逻辑可以无遗漏覆盖所有1~10位的密钥组合。
内容的提问来源于stack exchange,提问作者baepli
相关产品推荐
相关产品推荐

