首先要介紹一下什麼叫字典檔 -
早期有人破解無名密碼時,使用的是 "暴力破解法"
也就是說從
"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 慢慢跑好了... 跑了快三十分鐘!!
果真.. 用暴力破解法真的是很無奈、很笨的方法
程式跑的時間真的會久到一個不行...