能力值:
( LV7,RANK:100 )
2 楼
把程序或者算法的反汇编代码发上来才行呀。。
这样肯定看不出来的,照你的想法,MD5也能找出无数个对应关系,可是你也没法求逆~
能力值:
( LV2,RANK:10 )
3 楼
是ASP的,不是程序,无法反汇编。只能根据输入与输出猜测“黑盒”里面的东西。
我觉得是可逆的,因为很明显就能看出有一定的规律在,用的就是ASCII之类的东西。
它这算法远没MD5复杂。
6位的加密出12位的,9位的加密出18位的。
刚又去抓了几个1位的:
原字符 加密后字符
a uy
b s}
c p&
d n*
能力值:
( LV2,RANK:10 )
4 楼
终于找到了这个函数,能帮我看看可以解么?
我在不同的电脑试,都是同一字符得出同样的加密字串。好像那个seed 和Randomize会一样?
function mistake(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 mistake = dist end function
能力值:
( LV2,RANK:10 )
5 楼
初步分析后得出此算法可以逆求的结论。
先澄清几个问题:
1、LZ的本意应该是通过某种方式得到数据库中的加密字符串后,如何反过来求取明文字符串吧?
2、绝大多数情况下,密文字符串长度等于明文字符串长度的2倍,例外情况是如果产生的密文字符串中存在单引号',则过滤掉(丢弃');
3、算法中使用的伪随机数生产器函数Randomize()和Rnd()是两种特殊用法,即LZ所说的“会一样”,因为Randomize(length) 的参数仅跟明文字符串长度一样,显然变化不大,而Rnd(一个负数)按照MSDN的说法就是用这个负数参数作为随机种子,因而也变化不多。
由此可以设计出求逆方法。
能力值:
( LV2,RANK:10 )
6 楼
求逆方法大要:
1、密文字符串的奇数位置对于求逆有效,偶数位置可以忽略;
2、为了加快求逆速度,预先正向计算出(按ASP程序或者写个VB程序调用函数mistake(preString)):
int(94*rnd(-seed)+32)),其中让变量seed跑遍 1 ~ 125*(126+1);
3、对密文字符串,从串尾开始倒过来向串首开始分析,这是因为对于最后一位明文,mid(preString,i,1)和right(prestring,1)两个值是一样的;
能力值:
( LV2,RANK:10 )
7 楼
4、求取最末尾的一位明文。根据
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))
和mid(preString,i,1)==right(prestring,1),设最末尾的一位明文的ASCII码值为x,得到方程组如下:
E1: chr(seedo) == 末尾密文(奇数位置的)
E2: seedo = int ( 95 * rnd ( -x - seedi *x ) + 32
根据方程E1,查ASII码表可得到整数值seedo,肯定位于32 ~ 125之间;
根据方程E2,知道seedo即可查第二步中预先造好的整数表,得到负整数值-x - seedi *x;
然后,负整数值-x - seedi *x == -x * (seedi + 1),可以做整数分解或者穷尽x的一个小范围得出x和seedi。
需要注意的是由于是Int取整,查整数表时有可能出现几个结果,均需要算一下。
能力值:
( LV2,RANK:10 )
8 楼
5、最末尾的一位明文一位明文求出来后,还是根据密文产生公式:
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))
利用奇数位置的密文,从后往往前逐步逆推倒数第二位明文,方法还是查表。
能力值:
( LV2,RANK:10 )
9 楼
大约就是这些。分成好几次回复,主要是感觉看雪的回复编辑框太小了,真不方便一次性写很多。
应该没什么问题吧,欢迎指正。
能力值:
( LV2,RANK:10 )
10 楼
其实,对于负整数值-x - seedi *x == -x * (seedi + 1)的整数分解问题,并不需要真的去分解,可以事先造好一个127*127的乘积表,以后遇到乘积 x * (seedi + 1),查表即知乘积项。
能力值:
( LV2,RANK:10 )
11 楼
感谢楼上jeffcjh 的分析。另外留意到CSDN也有位兄弟研究过,特此贴上链接 http://blog.csdn.net/babyt/article/details/91691 供大家参考。
我的解密之路只限于穷举。因此后来是这么干的:
1. 生成6位字符的字典,以数字优先;
2. VB写了个小程序,依次生成对应字符的加密字符;
3. 搜索一下我要查询的加密的字符串--还真有!
至于从密码学的角度,怎么求逆,有兴趣的可以继续讨论一下。
能力值:
( LV2,RANK:10 )
12 楼
有一点小错误,第5步:
5、最末尾的一位明文一位明文求出来后,还是根据密文产生公式:
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))
利用奇数位置的密文,开始求取第一个明文字符,因为此时知道seed的初值(seed = length),往后依次求取第二个明文字符、第三个.......
能力值:
( LV2,RANK:10 )
13 楼
我看了 http://blog.csdn.net/babyt/article/details/91691,跟我想的思路大体一样,原来这个算法还在不少地方用过呢。
你原来的暴力穷举法就属于非密码学意义上的解决方法,对于比较复杂的口令显然是无效的。现在分析的破译方法的时间复杂度是多少呢?估计如下:
对于每个明文字符的求解,其实都是查表,故为常数时间O(1)。
对长为2n的密文,总的破译时间大约是O(n),考虑到可能在查表中遇到几个情况,故实际时间要多一些,但肯定不会多很多,因此求逆是极快的,基本不会有慢的感觉,与暴力破解相比。
能力值:
(RANK:1060 )
14 楼
不是单射,会逆出很多结果,比如密文>:h7%Kn*(=C+对应下面任意明文组合
[['`', 'a'], ['b', 'j', 'f', '^'], ['c', 'k', '[', 'S'], ['1', '3', '/'], ['"', '2', '*'], ['3']]
密文是明文,前一位密文,最后一位明文的函数
先穷举最后一位明文再求逆别的密文即可
能力值:
( LV2,RANK:10 )
15 楼
[QUOTE=forgot;1041171]不是单射,会逆出很多结果,比如密文>:h7%Kn*(=C+对应下面任意明文组合
[['`', 'a'], ['b', 'j', 'f', '^'], ['c', 'k', '[', 'S'], ['1', '3', '/'], ['"', '2', '*'], ['3']]
密文是明文...[/QUOTE]
其实并不需要求取所有原像,只要一个即可,对于身份认证都是等价的。