当前位置:C++技术网 > 资讯 > 暴力破解密码模拟程序,模拟暴力破译密码实现程序代码

暴力破解密码模拟程序,模拟暴力破译密码实现程序代码

更新时间:2015-10-06 16:52:28浏览次数:1+次

    这个是一时对暴力破解密码产生兴趣而编写的一个模拟代码,用来感受暴力破解的过程,这个不用在电影中感受,就可以在自己电脑感受。同时也可以学习密码方面的知识,提高密码安全的意识,也可以锻炼 一些编码能力。

    下面是程序截图:

   

暴力破解密码原理:
    通过简单的变换密码组合,枚举所有可能的密码组合来尝试比对。总有一组组合是对的。不过这个需要通过大量的比对才能实现破解。所以,密码长度越长,数字字母和符号的组合,大小写组合等,将会大大提高密码的暴力破解难度。

程序实现暴力破解的模拟原理:
    在ASCII编码范围内,对指定长度的密码进行排列组合,可想而知,长度越大,组合数越多。程序中使用的是全排列,排列了所有的组合情况,从编码的顺序来排,因此是最低效的。
    生成一个排列组合,就和密码比对,判断是否一致。当然在实际情况中,是去尝试登陆或者做其他的。比如破解wifi密码,就是将生成的密码组合去登陆连接路由器。
   程序中在密码的几位中,输出后在擦除,让密码组合在一个固定的位置变化,而不是大量的刷屏输出。这是函数里的最里层的for循环输出\b回退字符的作用。

实际应用场景:
    实际破解时,通常有密码字典,说白了,就是常用的密码的列表。通过分析我们的密码,得知一些惯用的密码组合,比如88888888。所以一开始就是用这些惯用密码来尝试,不行的话,再从头到尾尝试。对于无法输入的字符自然不会出现在密码中,所以这些字符也都会跳过。
    我们这个程序只是最基本的破解演示,如果要实际破解,则需要自己改进情况,根据实际情况优化算法。比如得知一个用户的生日,就可以使用生日组合来尝试,如果得到了姓名,就可以结合姓名信息组合尝试,信息越多,难度越低。

注意事项:
    所以,我们在平时设置密码时,尽量不要用生日姓名等信息来设置密码,因为这些信息早已在网上泛滥,随处可查了。如果让某人盯上,然后破解密码,那是相当容易的事情。
    不过,暴力破解并不是随处可用。几乎所有成熟的系统都会对登录次数做限制,超过多少次错误就拒绝连接登录。所以,也降低了暴力破解的风险。不过,你的信息泄露的太多,虽然不用暴力破解,也可以轻松的破解。

程序源码:

#include <iostream>
#include <string.h>
#include <stdlib.h>
char * pw = NULL;
char password[50];
int len =0;
bool po(int n);
using namespace std;
void main()
{
    cout<<"请输入您的密码: ";
    cin.getline(password,50);
    len = strlen(password);
    pw = new char[len+1];
    for(int i=0;i<len+1;i++)
        pw[i]=32;
    int n=0;
    cout<<"<<<整体匹配>>>:\n";
    cout<<"破解进行中... 匹配>>";
    if(po(n))
    cout<<"您刚才输入的密码是: ["<<pw<<"]"<<endl;
    system("pause");
}
bool po(int n)
{
    if(n>len)return false;
    for(int i=32;i<127;i++)
    {
        pw[n] = (char)i;
        if(n==len)
        {
            pw[n]='\0';//如果此处忽略则不可能匹配成功
            if(!strcmp(password,pw))
            {
                cout<<"破解成功!\n";
                return true;
            }
            else 
            {
                cout<<pw;
                for(int n=0;n<len;n++)// - 清除上一个密码组合
                    cout<<"\b";
            }
            return false;
        }
        if(po(n+1))return true;
    }
    return false;
}