原帖: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个.