原帖:http://community.csdn.net/Expert/topic/3329/3329845.xml?temp=.6935236 开始就觉得要耗费不少时间,但是想到好久没作些锻炼脑力的东西了,索性来一下,呵呵 ================================================================================ 加密代码如下: '加密密码开始 function encrypt(preString) Dim texts Dim seed Dim i,length prestring = trim(preString) length = len(preString) seed = length Randomize(length) texts = "" for i = 1 to length seed = int(94*rnd(-asc(mid(preString,i,1))-seed*asc(right(prestring,1)))+32) texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32)) next dim dist dist="" for i = 1 to len(texts) if mid(texts,i,1)<>"'" then dist=dist+mid(texts,i,1) end if next encrypt = dist end function '加密结束
这段程序是给用户输入的密码进行加密.此程序能否写出解密程序?应如何着手?
经过加密过后数据库显示密码的字符如下: aaGB0x?69Pf
这个密码前面有个空格,提问者没有说明,耗费些许时间 ================================================================================
解决方法: 看了两个小时,好象是可以逆出来的.不过估计要花更长时间,而且通用性不好.呵呵. 主要入手点

rnd(负数的值)是固定的0~1,不会改变 seed的值必定在32~126之间 第一个这句话中的第二个seed等于上次循环结束后的seed.
texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32)) 通过匹配chr(seed) / chr(int(94*rnd(-seed)+32)) 可以判断出哪几个字符是否相邻 因为可能会有单引号被过滤掉的情况.
准备工作,Word文档,做成表格便于理解

从最后一位开始算,最后一位的 mid(preString,i,1) = right(prestring,1)
所以我们可以构造成一个简单的方程式
 为了便于操作,用VB快速写个小工具进行验证,打开附件里的计算器进行运算. 除了第一个因为试验的原因时间长外,后面的每个字符破一个一分钟不到的时间 当然除了机器运算外,还要根据实际的经验来进行一些判断.

因为原来的加密函数中使用了Int来截取整数,所以重复性就很多 我从后往前破,破到倒数第六个的时候,我发现有两个组合可能性比较大 780103和780503,很象生日,就尝试在前面加了19,组合成19780103,加密后果然一致. 然后进一步验证了9这个项是符合算法规则的,于是破解结束.
从上面的组合中我们可以看到这个密码的原解最少有4*3*3*4*3=432个.

|