首先要介紹一下什麼叫字典檔 -
早期有人破解無名密碼時,使用的是 "暴力破解法"
也就是說從

"a", "b", .... "z"
"aa", "ab", ...  ,"az"
"ba", "bb", ... , "bz"
.....

這個看得出來了吧...就是把鍵盤上所有的組合都丟進去,
"暴力破解法" 就是一直不停的 try,不停的 try,try到密碼正確為止..
當然,有這種事情發生之後,無名就有防範措施了..

初學C語言的人,若要生成長度為100以內的所有可能
開始可能會想用100個 loop 去完成它
當然用想的也知道不可能這樣做!光是寫100個 loop,complier都不知道會不會過了

Recursive...

正解正常是要用 Recursive ,
很遺憾的是 Recursive 我寫了二天還是寫不出來
後來我放棄了 Recursive,
使用了人類最原始的 - 特徵觀查法去完成它
這個code是初版的,它真的是醜到不行
其中還使用了 goto 的指令,打破了一般人對於避免使用 goto 的禁忌

說到了底,這隻程式有下面
(1) 速度慢 -  為了開發時讓我比較清楚, 所以我調用了二次 strrev 函數
(2) 通用性差 - 這個例子我只生成 'a' - 'z' 的字元做為字典的基本單字,
                     大寫英文字母、數字、特殊符號都沒放進來, 再者魔術數字太多。
(3) 非遞迴 - 我知道它可以用 recursive 完成,但是卻不知道怎麼完成 (總說一句就是功力不夠)

以上全都是重大的缺點,
下次po上來將會先改進 (1), (2),
如果您知道 Recursive 該怎麼寫
也請您不吝分享您的 code 或是流程圖給我
再次強調,程式中所用的是 "特徵觀查法",
所以中間有看不懂的部份,
那就先留言或丟 mail 給我吧..

請注意,這個程式只是用來學習用,
請不要恣意試著用此程式進行不道德之行為...

源碼如下...

 // ====================================
// filename: directory.cpp
// author : edison.shih.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


char string[200];
char end_string[200];

// ====================================
// generate length = len directory
void directory(int len)
{           
      memset(string, 'a', len);
      int times=0;
      int i=0, j=0;
      int ptr1=0, ptr2=0;

Label:
      for(i=0; i<26; i++) {
            string[len-1] = 'a' + i;
            printf("%s\n", string);           
      }
      strrev(string);
      ptr1=0;
      while(string[ptr1]=='z') ptr1++;
      if(ptr1!=len) {
            for(j=0; j<ptr1; j++) string[j]='a';
            string[ptr1]++;
            strrev(string);           
            goto Label;
      }
     
}

// ====================================
// main function
int main(int argc, char **argv)
{
      memset(end_string, 200, 'z');     
      clock_t t1, t2;
      t1 = clock();
      for(int i=1; i<=5; i++) directory(i);
      t2 = clock();
      printf("elaspe: %lf\n", (double)(t2-t1)/(double)(CLK_TCK));
     
      return 0;
}
// ====================================

 

原本是想要測生成 100長度 以內所有組合需要多少時間
所以寫了一個 a.bat ( 內容為 directory.exe > a.txt) 來紀錄
但5分鐘後...生成的檔案已經肥到了2GB
終於我用了 ctrl + C 把程序中斷

接來下的生成檔..我用 notepad.exe 也沒辦法開啟..
連測長度為 5 以內的所有組合檔案都肥到不像話...
所以就不輸出到檔案..
還是用 Console 慢慢跑好了... 跑了快三十分鐘!!
果真.. 用暴力破解法真的是很無奈、很笨的方法
程式跑的時間真的會久到一個不行... 

arrow
arrow
    全站熱搜

    Edison 發表在 痞客邦 留言(2) 人氣()