电影里的密码破译模型设想

电影里的密码破解模型设想
在电影里经常可以看到,要打开一个保险箱的密码(比如密码是123),那么主角会插入一个机器,经过一些等待,会先后显示出3个密码:‘1’、‘2’、‘3’,然后主角输入“123”,密码破解成功,最后芝麻开门~对应的一个简单java程序如下所示:
未实现,也是面临的最重要的2个难点:
1、怎么得到这个密码的字符串
2、就算得到了该密码字符串,通常会对其进行加密之类的保护措施

package test;

import java.util.Scanner;

public class Test {
	
	private static final String code = "~a1~b2c3a#sd!3";
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		crackThePassword(code);
		boolean flag = true;
		do{
			System.out.println("请输入密码:");
			String input = s.nextLine();
			if(input.equals(code)){
				System.out.println("密码正确,芝麻开门~");
				flag = false;
			}
		}while(flag);
	}
	
	public static void crackThePassword(String code){
		System.out.println("破译开始");
		long start = System.currentTimeMillis();
		char[] array = {'a','b','c','d','e','f','g',
						'h','i','j','k','l','m','n',
						'o','p','q','r','s','t','u',
						'v','w','x','y','z','0','1',
						'2','3','4','5','6','7','8',
						'9','~','!','@','#','$','%'};
		char[] c = code.toCharArray();
		char[] result = new char[c.length];
		int k = 0;
		for (int i = 0; i < c.length; i++) {
			for (int j = 0; j < array.length; j++) {
				if(c[i]==array[j]){
					result[k]=array[j];
					k++;
				}
			}
		}
		String s = "";
		for (int i = 0; i < result.length; i++) {
			s = s+result[i];
		}
		System.out.println("破译结束");
		System.out.println("密码为:"+s);
		long end = System.currentTimeMillis();
		long time = end-start;
		System.out.println("用时:"+time+"秒");
	}
}

纯粹无聊随便写写,毫无技术含量,完全新手级别代码,欢迎大家评论~
下期将为大家带来,关于穷举法之类的稍微正常点的密码破解程序~
1 楼 kidding87 2013-03-08  
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?
2 楼 享受生活 2013-03-08  
kidding87 写道
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?



应该是加break;
还有lz这种密码是不实际的,code你都拿到了,还破解什么?暴力破解是猜密码,而不是拿到密码猜单个字符。
3 楼 kidding87 2013-03-08  
享受生活 写道
kidding87 写道
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?



应该是加break;
还有lz这种密码是不实际的,code你都拿到了,还破解什么?暴力破解是猜密码,而不是拿到密码猜单个字符。


break 内层,continue 外层,一个意思~
4 楼 QuarterLifeForJava 2013-03-08  
kidding87 写道
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?

呵呵,这位朋友不要当真,这种完全是YY出来的,你没看错,我YY出来的这里的确是一位一位破解的,在未来某时我想应该可以的,人类只要有想法,我想这种想法迟早会成真的,呵呵。另外引用一段别人的回答"那是电影啦,跟现实中是不一样的大多数都是穷举法,就是用计算机快速的实验所有可能的密码,最后找出正确的,因为很多密码门都是数字密码,位数又很短,所以破解起来并不困难。现实中穷举法暴力破解密码都需要很长的时间,对于有些加密算法根本就是无从破解,所以电影和现实并不能等同起来,在电影中破解密码当然只需要几秒钟,否则怎么拍呢?"
是的,很快我就会给大家介绍下穷举法之类稍微正常、现实一点的算法
5 楼 QuarterLifeForJava 2013-03-08  
享受生活 写道
kidding87 写道
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?



应该是加break;
还有lz这种密码是不实际的,code你都拿到了,还破解什么?暴力破解是猜密码,而不是拿到密码猜单个字符。

恩,呵呵,我都说了,是YY的,不现实的,我在之前就声明了:
未实现,也是面临的最重要的2个难点:
1、怎么得到这个密码的字符串
2、就算得到了该密码字符串,通常会对其进行加密之类的保护措施
还有,拿到code不等于就破解密码了哦~亲。
6 楼 仗剑执法1 2013-03-08  
目前只能想到暴力破解,没有想到第二种方法。暴力破解的前提是对方没有设置尝试次数限制,暴力破解的速度取决于密码长度,通常的密码长度不会超过6位,尝试次数一百万足够了,速度很快。
7 楼 仗剑执法1 2013-03-08  
QuarterLifeForJava 写道
kidding87 写道
   if(c[i]==array[j]){ 
                    result[k]=array[j]; 
                    k++; 
//这里咋说也需要个continue吧
                }

还有密码有一位一位数破解的?

呵呵,这位朋友不要当真,这种完全是YY出来的,你没看错,我YY出来的这里的确是一位一位破解的,在未来某时我想应该可以的,人类只要有想法,我想这种想法迟早会成真的,呵呵。另外引用一段别人的回答"那是电影啦,跟现实中是不一样的大多数都是穷举法,就是用计算机快速的实验所有可能的密码,最后找出正确的,因为很多密码门都是数字密码,位数又很短,所以破解起来并不困难。现实中穷举法暴力破解密码都需要很长的时间,对于有些加密算法根本就是无从破解,所以电影和现实并不能等同起来,在电影中破解密码当然只需要几秒钟,否则怎么拍呢?"
是的,很快我就会给大家介绍下穷举法之类稍微正常、现实一点的算法



现实中穷举法暴力破解密码都需要很长的时间,对于有些加密算法根本就是无从破解。
这句话表示不赞同,暴力破解的切入点是在按键处,也就是用密码明文进行暴力破解,这种穷举法就是10的几次方, 你说的加密算法是在按键后又做了一次加密运算,用密文去解密,暴力破解很难搞定。