n唯数组的排列组合、md5解密算法(简单尝试)
package com.csair.rsa;import java.util.ArrayList;import java.util.List;/** * 破译64位md5加密 * @author Administrator * @data Mar 21, 2012 */public class DeMd5 {/** * 程序运行主方法 * @param args */public static void main(String[] args) {DeMd5 deMd5 = new DeMd5();String secret = "jgzkFFMRea6bf2DiA1Huiw==";String result = deMd5.getDeMd5(secret);System.out.println("解析出明文为:"+result);}/** * 根据提供的密文,解析出原文 * @param secret * @return */public String getDeMd5(String secret){String result = "";boolean flag = true; md5 nMd5 = new md5();char[] c = initDate();List<String> list = null;int length = 0;while(flag){for(int num = 1; num < 5; num ++){length = num;list = getCom(c,num);boolean flagC = true;for(int j = 0; j < list.size(); j ++){String value = nMd5.getMd5(list.get(j));if(value.equals(secret)){result = list.get(j).toString();flagC = false;break;}}if(!flagC){flag = false;break;}}if(length == 4){result = "暂时没有解析出对应的明文。";flag = false;}}return result;}/** * 获取n个字符的所有的组合 * @param c * @param n * @return */public List getCom(char[] c,int n){List<String> list = new ArrayList<String>();list = DDTest.getCom(list,c,n);return list;}/** * 初始化字符集 */public char[] initDate(){char[] c= new char[62];for (int i = 48; i <= 57; i++) {c[i-48] = (char)i;}for (int i = 65; i <= 90; i++) {c[i-55] = (char)i;}for (int i = 97; i <= 122; i++) {c[i-61] = (char)i;}return c;}}
?
备注:本文只是做个简单的尝试,由于md5加密算法是不可逆的,所以用的是暴力破解的方式,所有的数字、小写字母、大写字母一起排列组合,一个一个尝试加密,然后与提供的密文进行比较。如果相同,则明文就是尝试的那一个。再次申明:只是简单的尝试,如果位数过多,机器会跑不动的,会内存溢出,所以只是学习之用,了解一种思路。有的网站声称可以破解,应该是先把所以的组合的密钥都保存到数据库里面,根据用户提供的密文,到数据库中查找对应的那一个密文对应的明文,同样是需要很强的机器和内存。