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