FinalShell 密码在线解析方法(含完整源码与运行平台)
✨ 背景说明
FinalShell 是一款流行的远程连接工具,但其保存的登录密码是加密的。如果我们想找回忘记的密码,可以使用逆向算法对其进行解密。
本文提供:
- 完整 Java 解密源码
- 在线运行平台(菜鸟工具 Java 编译器)
- 使用说明
💡 解密原理
FinalShell 使用 Base64 + DES 加密算法对密码进行加密。我们可以根据其逆向逻辑,通过提取头部字节生成密钥,并解密密码内容。
🧪 在线运行平台介绍
我们使用的是菜鸟工具 Java 在线运行平台
优点:
- 无需安装本地 JDK
- 支持导入标准库
- 可直接复制运行解密逻辑
🧾 使用步骤
- 打开:菜鸟工具 Java 编译器
- 将下方 Java 源码完整粘贴到编辑器中
- 替换
decodePass("...")
中的密文为你自己的 FinalShell 密码 - 点击“执行代码”,即可看到解密结果
🧾 从 FinalShell 导出配置
从导出的xxx_connect_config.json
文件中找到password
就是需要的密文
🧰 Java 源码(复制粘贴到平台)
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Random;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;public class FinalShellDecodePass {public static void main(String[] args)throws Exception {System.out.println(decodePass("PDcUCTxxxxxxxxxxxxxxxxxxxxxKHgV"));}public static byte[] desDecode(byte[] data, byte[] head) throws Exception {SecureRandom sr = new SecureRandom();DESKeySpec dks = new DESKeySpec(head);SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey securekey = keyFactory.generateSecret(dks);Cipher cipher = Cipher.getInstance("DES");cipher.init(2, securekey, sr);return cipher.doFinal(data);}public static String decodePass(String data) throws Exception {if (data == null) {return null;} else {String rs = "";byte[] buf = Base64.getDecoder().decode(data);byte[] head = new byte[8];System.arraycopy(buf, 0, head, 0, head.length);byte[] d = new byte[buf.length - head.length];System.arraycopy(buf, head.length, d, 0, d.length);byte[] bt = desDecode(d, ranDomKey(head));rs = new String(bt);return rs;}}static byte[] ranDomKey(byte[] head) {long ks = 3680984568597093857L / (long)(new Random((long)head[5])).nextInt(127);Random random = new Random(ks);int t = head[0];for(int i = 0; i < t; ++i) {random.nextLong();}long n = random.nextLong();Random r2 = new Random(n);long[] ld = new long[]{(long)head[4], r2.nextLong(), (long)head[7], (long)head[3], r2.nextLong(), (long)head[1], random.nextLong(), (long)head[2]};ByteArrayOutputStream bos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(bos);long[] var15 = ld;int var14 = ld.length;for(int var13 = 0; var13 < var14; ++var13) {long l = var15[var13];try {dos.writeLong(l);} catch (IOException var18) {var18.printStackTrace();}}try {dos.close();} catch (IOException var17) {var17.printStackTrace();}byte[] keyData = bos.toByteArray();keyData = md5(keyData);return keyData;}public static byte[] md5(byte[] data) {String ret = null;byte[] res=null;try {MessageDigest m;m = MessageDigest.getInstance("MD5");m.update(data, 0, data.length);res=m.digest();ret = new BigInteger(1, res).toString(16);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return res;}
}
🧾 示例效果
在控制台中你会看到解密后的真实密码,例如:
123456abc!
🛡️ 声明与警告
本工具仅供个人学习与恢复忘记密码使用,严禁用于非法用途。否则后果自负。