c源码:生成一个自己的口令字典.txt

来自「学习(编程技巧_编程知识_程序代码),是学习编程不可多得的学习精验」· 文本 代码 · 共 167 行

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

--------------------------------------------------------------------------------
 
第八军团 时间:2004-1-23 15:58:06 
   
   使用一个单词文件,本程序只考虑单个单词的大小写变形和两个变形单词的组合,由此生成一个字典, 
    例如对于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. */ 
 
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?