C源码:生成一个自己的口令字典

来源:互联网 发布:ftp定时下载软件 编辑:程序博客网 时间:2024/04/30 09:30
使用一个单词文件,本程序只考虑单个单词的大小写变形和两个变形单词的组合,由此生成一个字典,
例如对于hello和unix两个单词的单词文件,本程序可生成:
hello
Hello
HELLO
unix
Unix
UNIX
hellounix
helloUnix
helloUNIX
Hellounix
HelloUnix
HelloUNIX
HELLOunix
HELLOUnix
HELLOUNIX
UNIXHELLO
UNIXhello
UNIXHello
unixHELLO
unixhello
unixHello
UnixHELLO
Unixhello
UnixHello
由此可见,我这种简单的方法能生成的口令字典也是很大的。如果你的口令能在这种字典中找到,那么
被别人破解也是几秒钟的事情!
单词文件 PWDICT.PWS 举例如下:
root
2000
server
sco
unix
hello
运行程序命令是: PWDICT.EXE < PWDICT.PWS > PWDICT.DIC
本程序使用了递归和输入、输出重定向。
PWDICT.C 源程序如下:(单词文件最多支持300个单词,每个单词最长20个字符)

/* pwdict.c --- Generate passwd dict
M.L.Y 2001.2
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_STRING_LEN 20
#define MAX_PWS 300

char *upperstr(char *str)
{
int i, n;

n = strlen((char *)str);
for(i = 0; i < n; i++)
str[i] = toupper(str[i]);
return str;
}

char *lowerstr(char *str)
{
int i, n;

n = strlen((char *)str);
for(i = 0; i < n; i++)
str[i] = tolower(str[i]);
return str;
}

char *capstr(char *str)
{
str[0] = toupper(str[0]);
return str;
}

int disp_pd(char *s1, char *s2)
{
int n1, n2;

n1 = strlen(s1);
n2 = strlen(s2);
if(n1 == 0 && n2 == 0) return 0;
if(n1 == 0 || n2 == 0) return printf("%s%s/n", s1, s2);
printf("%s%s/n", s1, s2);
printf("%s%s/n", s2, s1);
return 1;
}

int gen_pd2s(char *s1, char *s2, int mode)
{
char ts1[MAX_STRING_LEN+1], ts2[MAX_STRING_LEN+1];
int k1 = 0, k2 = 0, n1, n2;

n1 = strlen(s1);
n2 = strlen(s2);
if(n1 == 0 || n2 == 0) return 0;
if(n1 > MAX_STRING_LEN || n2 > MAX_STRING_LEN) return 0;
strcpy(ts1, s1);
if(strcmp(s1, capstr(strcpy(ts1, s1))) == 0) k1 = 3;
else if(strcmp(s1, upperstr(ts1)) == 0) k1 = 2;
else if(strcmp(s1, lowerstr(ts1)) == 0) k1 = 1;
strcpy(ts2, s2);
if(strcmp(s2, capstr(strcpy(ts2, s2))) == 0) k2 = 3;
else if(strcmp(s2, upperstr(ts2)) == 0) k2 = 2;
else if(strcmp(s2, lowerstr(ts2)) == 0) k2 = 1;
if(mode == 1)
{
printf("%s/n", s1);
if(isalpha(ts1[0]))
{
if(k1 != 3) printf("%s/n", capstr(strcpy(ts1,s1)));
if(k1 != 2) printf("%s/n", upperstr(ts1));
if(k1 != 1) printf("%s/n", lowerstr(ts1));
}
printf("%s/n", s2);
if(isalpha(ts2[0]))
{
if(k2 != 3) printf("%s/n", capstr(strcpy(ts2,s2)));
if(k2 != 2) printf("%s/n", upperstr(ts2));
if(k2 != 1) printf("%s/n", lowerstr(ts2));
}
if(!isalpha(ts1[0])) return gen_pd2s(s1, s2, 2);
gen_pd2s(upperstr(ts1), s2, 2);
gen_pd2s(lowerstr(ts1), s2, 2);
if(k1 == 0 || k1 == 3) gen_pd2s(s1, s2, 2);
if(k1 != 3) gen_pd2s(capstr(strcpy(ts1,s1)), s2, 2);
}
if(mode == 2)
{
if(!isalpha(ts2[0])) return disp_pd(s1, s2);
disp_pd(s1, upperstr(ts2));
disp_pd(s1, lowerstr(ts2));
if(k2 == 0 || k2 == 3) disp_pd(s1, s2);
if(k2 != 3) disp_pd(s1, capstr(strcpy(ts2, s2)));
}
return 0;
}

int main()
{
char ps[MAX_PWS][MAX_STRING_LEN+1];
int i, j, n;

for(n = 0; n < MAX_PWS; n++)
{
ps[n][0] = '/0';
gets(ps[n]);
if(strlen(ps[n]) == 0) break;
}
for(i = 0; i < n-1; i++)
for(j = i+1; j < n; j++)
gen_pd2s(ps[i], ps[j], 1);
return 0;
}

/* End of file. */  
原创粉丝点击