tuonioooo 2012-03-23
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加密算法是不可逆的,所以用的是暴力破解的方式,所有的数字、小写字母、大写字母一起排列组合,一个一个尝试加密,然后与提供的密文进行比较。如果相同,则明文就是尝试的那一个。再次申明:只是简单的尝试,如果位数过多,机器会跑不动的,会内存溢出,所以只是学习之用,了解一种思路。有的网站声称可以破解,应该是先把所以的组合的密钥都保存到数据库里面,根据用户提供的密文,到数据库中查找对应的那一个密文对应的明文,同样是需要很强的机器和内存。