n唯数组的排列组合、md5解密算法(简单尝试)

package com.csair.rsa;

import java.util.ArrayList;
import java.util.List;
/**
 * 得到n位的所有组合
 * @author Administrator
 * @data Mar 21, 2012
 */
public class DDTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list = new ArrayList<String>();
		char[] c = {'0','1','2','3','4','5','6','7','8','9'};
		for(int i = 1;i < 5;i ++){
			list = getCom(list,c,i);
			viewData(list);
		}
	}

	/**
	 * 获取所有的组合情况放置到list中
	 * @param list
	 * @param c
	 * @param n
	 * @return
	 */
	public static List getCom(List list,char[] c,int n){
		List<String> listCurrent = new ArrayList<String>();
		if(n == 1){
			for(int i = 0; i < c.length; i ++){
				listCurrent.add(c[i]+"");
			}
		}else{
			List<String> preListCurrent = getCom(list, c, n-1);
			for(int z = 0; z < preListCurrent.size(); z ++){
				for(int i = 0; i < c.length; i ++){
					listCurrent.add(preListCurrent.get(z).toString()+c[i]);
				}
			}
		}
		return listCurrent;
	}
	
	/**
	 * 读取出list中的数据
	 * @param list
	 */
	public static void viewData(List list){
		for(int z = 0; z < list.size(); z ++){
			System.out.println(list.get(z).toString());
		}
	}
}
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加密算法是不可逆的,所以用的是暴力破解的方式,所有的数字、小写字母、大写字母一起排列组合,一个一个尝试加密,然后与提供的密文进行比较。如果相同,则明文就是尝试的那一个。再次申明:只是简单的尝试,如果位数过多,机器会跑不动的,会内存溢出,所以只是学习之用,了解一种思路。有的网站声称可以破解,应该是先把所以的组合的密钥都保存到数据库里面,根据用户提供的密文,到数据库中查找对应的那一个密文对应的明文,同样是需要很强的机器和内存。

相关推荐