操作前提:
获得数据库密文,对IMC的程序目录有直接可读权限;
如果你有其它方式获得密文也可以。
我这里以先有服务器权限举例。在IMC的安装目录下找到文件名为“dma.conf”内容如下图
密文格式:
-xx-xx-xx-xx-xx-xx-xx-xx (xx为整数)
没见过的密文格式,百度无果。
打包下载了所有的*.jar文件到本地,反编译查看加密/解密算法
以下是解密算法,以密文 -97-110-94 为例,
private static String decrypt(String et)
{
if (!et.startsWith(“-“)) { //判断密文是否以“-”开头
log.error(“Invalid encrypted text: ” + et);
return null;
}
String[] strs = et.substring(1).split(“-“);
/**
* 这里把密文以“-”为分隔符分割存放到数组strs[]里,就是只取出每一个“-”之间的整数,即
* strs[0]=97
* strs[1]=110
* strs[2]=94
*/
byte[] bytes = new byte[strs.length];
for (int i = 0; i < strs.length; i++)
{
try {
int b = Integer.parseInt(strs[i]) + i * 16 % 256; //这里是算法的核心代码,数组的下标值(i)乘上16取余256再加上第i个数组的值。第一次循环就是0*16%256+97把结果赋给变量b,此时b=97,第二次b=126,第三次b=126
if (b > 255) { //整个判断的是如果b>255则把b-256在赋值给b,表达式表示为b=b-256
b -= 256;
}
bytes[i] = ((byte)b); //把整形变量b转换成字节然后存放在上面创建的字节数组bytes[]里
} catch (NumberFormatException nfe) {
return null;
}
}
String str = new String(bytes); //这里把之前算出来的b,就是存放入bytes[]数组里的数据转换成字符,不知道怎么转换的,参考十进制的ASCII码表,转换之后把结果存放到变量str。举例的结果解密结果为“a~~”
if (!str.endsWith(“~~”)) { //最后检查是否以字符“~~”结尾
log.error(“Invalid encrypted text: ” + et);
return null;
}
return str.substring(0, str.length() – 2); //把解密后的结果最后两位去掉,去掉“~~”之后的结果就是明文。举例的结果解密结果为“a”
}