当前位置:C++技术网 > 资讯 > mxn组合的密码枚举密码破解的两种实现方式代码实现

mxn组合的密码枚举密码破解的两种实现方式代码实现

更新时间:2015-06-26 00:06:51浏览次数:1+次

#include <Windows.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

static int nCount;
// - 递归实现
void TryPwd(char *strPwd, int iCharCount, int iPwdLen)
{
    static bool bFirst = false;
    static char *ch = new char[iPwdLen+1];
    if (!bFirst)
    {
        ZeroMemory(ch, iPwdLen+1);
        bFirst = true;
    }
    if(0 == iPwdLen)
    {
        printf("%s\n", ch);
        nCount++;
        return;
    }
    for (int j=0; j<iCharCount; j++)
    {
        ch[iPwdLen-1] = strPwd[j];
        TryPwd(strPwd, iCharCount, iPwdLen-1);
    }
}
// - 循环实现
void TryPwd2(char* CharMap,DWORD dwCharNum,DWORD dwLens)
{
    BYTE pPassBuff[32] = {0}; 

    DWORD* dwIndex = new DWORD[dwLens + 1];   //每个位的计数器,由于最后会溢出一位,所以这里加一
    memset(dwIndex,0,sizeof(DWORD) * dwLens);
    DWORD i;
    do 
    {
        for (DWORD n = 0; n < dwLens; n++)
        {
            pPassBuff[n] = CharMap[dwIndex[n]];
        }
        printf("%s\n", pPassBuff);
        dwIndex[0] ++;  //尾数加一
        for (i = 0; (i < dwLens) && (dwIndex[i] == dwCharNum); i++)
        {
            dwIndex[i] = 0;
            dwIndex[i + 1] ++;  //进位到下一位
        }
    } while (i < dwLens);
    delete [] dwIndex;
}

int main()
{
    char chPwd[] = {'A','B','C'};
    int iPwdLen = 3;
    TryPwd(chPwd, sizeof(chPwd), iPwdLen); // - 递归实现
    TryPwd2(chPwd, sizeof(chPwd), iPwdLen);// - 非递归实现
    printf("密码组合数:%d", nCount);
    system("pause");
    return 0 ;
}

    mxn组合的密码破解的两种实现方式代码。第一种版本使用递归方式实现,第二种方式使用循环实现,两个函数的参数列表一样,第一个是组成密码的可能的字符的数组,第二个参数是数组字符个数,即密码中每一位的取值字符种数。第三个参数是密码长度。代码中每一句的作用,请读者自己细细品味。