最近啃数据结构中,刚啃完单链表,关于单链表我啃了不下三次吧,感觉每次的收获都不一样,并不是做无用功。这个月要完成的比较多,感觉压力还是很萌萌哒的,但是计划赶不上变化,现在想利用C写一个弱指令生成工具。可以当作练练手,生成的字典以后也会有用处的吧。
个人感觉难度并不是很大。首先了解弱指令,弱指令就是按照规定遍历生成的密码列表,弱指令有什么用呢?在破解密码方面会有点用,暴力破解法的核心也是字典,有强大的字典,加上多线程机制,然后让计算机去慢慢跑。弱指令是按照个人要求生成的,例如你要破解以a为头字符的4位密码,就规定:a为头字节+密码长度为4。但现在我们有一个不是问题的问题,我们知道一个4位的密码可以有多少种不同组合,完全不能想象。以ACSII码为例,其中的编码就有128个,除去通用的32个控制符,剩下的大小字母十进制数专用符号也有96个,4个密码位每个就有96种字符,容我算算4位密码最多有多少种组合··· 算···算···还是算了···
这么优雅、风骚,如此有情调的工作就让计算机去做吧,创造计算机的另一个原因就是为了代替人类解决一些比较繁琐的工作。现在谈一下关于编写程序需要的内容,首先需要掌握C文件操作函数的运用,我们要的是生成密码列表,也就是txt格式的文件,将密码都输出在文档里面,所以需要用到这些函数。接着需要考虑用什么算法写,最容易想到的是利用四层循环遍历,我也打算用这个方法。估算一下时间复杂度T(n^4),效率低得可怕,虽然不怕CPU扛不住,但是完整的生成完估计需要一段时间。当然一定有其他效率更高的算法,可以慢慢改进。
由于只是练手,暂时就以生成4位密码为程序的功能,当然生成5位、6位···都可以,只不过用多层循环遍历效率的确是太低了。除此之外,还要考虑一下磁盘空间,4位密码占用的不会那么多,但是4位5位6位···都放在一起就不好说了。
现在只是先准备理论方面的内容···程序实现估计还要有一段时间,因为单链表啃完的是一些基本操作,还剩下逆置操作要实现。这里可以先说一下逆置操作函数的算法思维,很骄傲的是,这个算法既然是在我上数学课的时候想出来的。初中到现在貌似数学压根没及格过,猛戳泪点。扯远了··· 一个链表,有一个头指针指向头结点,而每个结点的地址域都存储下一个结点的地址,最后一个结点指向NULL。so,我们可以利用两个结构体指针,将头指针的地址域指向NULL,然后两个结构体指针一前一后,将下一个结构体指针指向的结点地址域改变,指向前一个结构体指针指向的结点地址域,慢慢遍历下去即可了,最终需要将头指针指向原最后结点。说起来容易写起来并不是那么容易,这里只是扯一下链表,有兴趣的可以看看。
说了这么多,还是想表达,在写弱指令生成器之前要先完成逆置操作函数,因为个人学习的范围比较广,还有汇编语言、计算机网络、windows编程要看,所以进展比较慢。程序的实现,估计会在下星期完成。
个人感觉难度并不是很大。首先了解弱指令,弱指令就是按照规定遍历生成的密码列表,弱指令有什么用呢?在破解密码方面会有点用,暴力破解法的核心也是字典,有强大的字典,加上多线程机制,然后让计算机去慢慢跑。弱指令是按照个人要求生成的,例如你要破解以a为头字符的4位密码,就规定:a为头字节+密码长度为4。但现在我们有一个不是问题的问题,我们知道一个4位的密码可以有多少种不同组合,完全不能想象。以ACSII码为例,其中的编码就有128个,除去通用的32个控制符,剩下的大小字母十进制数专用符号也有96个,4个密码位每个就有96种字符,容我算算4位密码最多有多少种组合··· 算···算···还是算了···
这么优雅、风骚,如此有情调的工作就让计算机去做吧,创造计算机的另一个原因就是为了代替人类解决一些比较繁琐的工作。现在谈一下关于编写程序需要的内容,首先需要掌握C文件操作函数的运用,我们要的是生成密码列表,也就是txt格式的文件,将密码都输出在文档里面,所以需要用到这些函数。接着需要考虑用什么算法写,最容易想到的是利用四层循环遍历,我也打算用这个方法。估算一下时间复杂度T(n^4),效率低得可怕,虽然不怕CPU扛不住,但是完整的生成完估计需要一段时间。当然一定有其他效率更高的算法,可以慢慢改进。
由于只是练手,暂时就以生成4位密码为程序的功能,当然生成5位、6位···都可以,只不过用多层循环遍历效率的确是太低了。除此之外,还要考虑一下磁盘空间,4位密码占用的不会那么多,但是4位5位6位···都放在一起就不好说了。
现在只是先准备理论方面的内容···程序实现估计还要有一段时间,因为单链表啃完的是一些基本操作,还剩下逆置操作要实现。这里可以先说一下逆置操作函数的算法思维,很骄傲的是,这个算法既然是在我上数学课的时候想出来的。初中到现在貌似数学压根没及格过,猛戳泪点。扯远了··· 一个链表,有一个头指针指向头结点,而每个结点的地址域都存储下一个结点的地址,最后一个结点指向NULL。so,我们可以利用两个结构体指针,将头指针的地址域指向NULL,然后两个结构体指针一前一后,将下一个结构体指针指向的结点地址域改变,指向前一个结构体指针指向的结点地址域,慢慢遍历下去即可了,最终需要将头指针指向原最后结点。说起来容易写起来并不是那么容易,这里只是扯一下链表,有兴趣的可以看看。
说了这么多,还是想表达,在写弱指令生成器之前要先完成逆置操作函数,因为个人学习的范围比较广,还有汇编语言、计算机网络、windows编程要看,所以进展比较慢。程序的实现,估计会在下星期完成。
我就先挂最简化的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int x1,x2,x3,x4;
system("color 0A");
printf("/* 字典生成器——测试版 */\n");
printf("/* 开发工具: VC++6.0 */\n");
printf("/* 开发语言: C */\n");
printf("/* 开发者: H */\n");
printf("/* 时间复杂度: O(n^6) */\n");
printf("\n生成4位密码字典···\n");
system("md c:\\password"); //生成该文档
fp = fopen("c:\\password\\4位密码字典.txt","w+");
if(fp == NULL)
{
printf("文件生成失败!\n");
exit(1);
}
printf("\n正在生成,需要的时间与计算机的配置、状态挂钩钩哦,请稍后!\n");
for(x1 = 33;x1 < 126;x1++) //程序的核心
{
for(x2 = 33;x2 < 126;x2++)
{
for(x3 = 33;x3 < 126;x3++)
{
for(x4 = 33;x4 < 126;x4++)
{
fprintf(fp,"%c%c%c%c\n",x1,x2,x3,x4);
}
}
}
}
if(fclose(fp) != 0)
{
printf("文件指针释放出错!\n");
}
printf("生成完毕!请到指定目录下查看!\n");
}