`

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

分享到:
评论

相关推荐

    浅析Java 常用的 4 种加密方式(MD5+Base64+SHA+BCrypt)

    该方法将输入的字符串转换为 byte 数组,然后使用 MessageDigest 类的 getInstance 方法获取 MD5 加密对象,最后将加密后的哈希值转换为字符串。 二、Base64 加密 Base64 是一种常用的编码方式,可以将二进制数据...

    DES加密解密C/C++接口

    DES(Data Encryption Standard)是一种经典的对称加密算法,由IBM在1970年代初开发,后被美国国家标准局(NIST)采纳为标准。它使用64位的数据块进行加密,其中包含56位的有效密钥。DES的加密过程分为两步:初始...

    全部古典密码加密与解密的C语言程序

    C语言实现需创建并操作二维数组,处理矩阵中的字符排列。 7. **Vigenere密码**:是一种多表密码,使用多个Caesar密码的密钥组合。C语言实现需要动态生成多个密钥表,并逐个应用到明文中。 8. **Beaufort密码**:...

    tictactoeleetcode-JavaPlayground:Java注解、线程使用、设计模式、算法训练等

    MD5 加密 AES256 解密 AES256 加密 AES 加密 AES 解密 数组 查找最大产品 从数组中查找缺失的数字 找到第二大值 求最小公数 查找最低、最高索引 向左移动零 基本 位移位 行分隔符 井字游戏 行分隔符 数据结构 比较器...

    PHP函数大全.pdf

    - `md5()`:计算字符串的MD5散列值。 - `microtime()`:获取当前时间的微秒级精度的时间戳。 - `base64_encode()` 和 `base64_decode()`:进行Base64编码和解码。 3. **数组函数**: - `array()`:创建新的数组...

    Solitaire:Bruce Schneier的纸牌加密算法的简化版本的实现

    5. **加密和解密**:使用生成的密钥对明文进行加密,解密时则需要逆向执行相同的步骤。 在Java代码中,会定义一个`Solitaire`类,包含这些操作的函数,如`shuffle()`(洗牌)、`cut()`(切牌)和`deal()`(发牌)。...

    C程序范例宝典(基础代码详解)

    实例286 MD5加密 412 实例287 RSA加密 419 实例288 DES加密 420 实例289 RC4加密 424 实例290 SHA1加密 427 实例291 恺撒加密 432 第11章 游戏 435 实例292 猜数字游戏 436 实例293 24点游戏 438...

    leetcode

    7. 回溯法:解决组合问题、排列问题、N皇后问题等。 8. 贪心算法:在每一步选择最优解,如活动选择问题、背包问题。 9. 分治策略:快速排序、归并排序、最小生成树(Kruskal、Prim)等。 10. 图论:深度优先搜索...

    letterRC4:修改了英文字母的 RC4 实现

    它以其简单、快速的加密和解密过程而闻名,适合于低内存设备和高速数据流加密。在Java中实现RC4算法通常涉及到对原始算法的封装,以便在Java环境中方便地使用。"字母RC4"描述可能是指在RC4算法的基础上,对英文字符...

    C#编程经验技巧宝典

    88 &lt;br&gt;0136 如何进行文本加密与解密 88 &lt;br&gt;0137 如何区别0、空字符串、Null、Empty和Nothing 89 &lt;br&gt;0138 从字符串中分离文件路径、文件名及扩展名 89 &lt;br&gt;0139 如何批量替换某一类字符串 89...

    WinForms疑难解答.doc

    在C#中,可以使用`System.Security.Cryptography`命名空间提供的类来进行加密解密操作。 **43. MD5加密用户密码** MD5是一种散列算法,用于将密码转换成不可逆的散列值。虽然MD5已经不再安全,但在某些场景下仍然被...

Global site tag (gtag.js) - Google Analytics