首页
社区
课程
招聘
[求助]我可以得到无限组加密后的字串,但却看不出如何加密
发表于: 2012-1-30 21:09 7077

[求助]我可以得到无限组加密后的字串,但却看不出如何加密

2012-1-30 21:09
7077
abc123        >:h7%Kn*(=C+
aaa333        >:QjYXd@\Rk1
abc124        :LC+:L/|n*$O
abc133        >:h7%Kn*3k4f
bcd123        =?=?TcaGJzYX
abc125        7Y3kYX^Ml/^M       
bbb222         @26^YXPlaGB-
aaa111        D)t{/|I| ak1
aaa222        A/Kw(=.#xraG
aaa444        :L,,^M@2`I=?
AAA444        LuKwOn,,I|@2
aaa555        7Yyp"XJz}gzn
......
如果还需要啥,我可以再生成

一、
来自2处的,都是采用这个加密方式。
说明是采用同一算法。而不是某个程序员自已想出来的。
二、
我现在能看出的就是,如果第一位和最后一位都相同时,生成的密码串的首2位就是一样。
第1组和第4组原文就差第5位数字,结果是加密出来的前面几位也都相同。

越看越头晕,望高人释疑,谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
把程序或者算法的反汇编代码发上来才行呀。。
这样肯定看不出来的,照你的想法,MD5也能找出无数个对应关系,可是你也没法求逆~
2012-1-30 21:37
0
雪    币: 43
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是ASP的,不是程序,无法反汇编。只能根据输入与输出猜测“黑盒”里面的东西。
我觉得是可逆的,因为很明显就能看出有一定的规律在,用的就是ASCII之类的东西。
它这算法远没MD5复杂。

6位的加密出12位的,9位的加密出18位的。
刚又去抓了几个1位的:
原字符   加密后字符
a            uy
b            s}
c            p&
d            n*
2012-1-30 22:05
0
雪    币: 43
活跃值: (116)
能力值: ( 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
2012-1-31 09:48
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
初步分析后得出此算法可以逆求的结论。
先澄清几个问题:
1、LZ的本意应该是通过某种方式得到数据库中的加密字符串后,如何反过来求取明文字符串吧?
2、绝大多数情况下,密文字符串长度等于明文字符串长度的2倍,例外情况是如果产生的密文字符串中存在单引号',则过滤掉(丢弃');
3、算法中使用的伪随机数生产器函数Randomize()和Rnd()是两种特殊用法,即LZ所说的“会一样”,因为Randomize(length) 的参数仅跟明文字符串长度一样,显然变化不大,而Rnd(一个负数)按照MSDN的说法就是用这个负数参数作为随机种子,因而也变化不多。
由此可以设计出求逆方法。
2012-1-31 11:23
0
雪    币: 58
活跃值: (28)
能力值: ( 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)两个值是一样的;
2012-1-31 11:32
0
雪    币: 58
活跃值: (28)
能力值: ( 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取整,查整数表时有可能出现几个结果,均需要算一下。
2012-1-31 11:48
0
雪    币: 58
活跃值: (28)
能力值: ( 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))
利用奇数位置的密文,从后往往前逐步逆推倒数第二位明文,方法还是查表。
2012-1-31 11:51
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大约就是这些。分成好几次回复,主要是感觉看雪的回复编辑框太小了,真不方便一次性写很多。
应该没什么问题吧,欢迎指正。
2012-1-31 11:53
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
其实,对于负整数值-x - seedi *x == -x * (seedi + 1)的整数分解问题,并不需要真的去分解,可以事先造好一个127*127的乘积表,以后遇到乘积 x * (seedi + 1),查表即知乘积项。
2012-1-31 12:30
0
雪    币: 43
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢楼上jeffcjh 的分析。另外留意到CSDN也有位兄弟研究过,特此贴上链接 http://blog.csdn.net/babyt/article/details/91691   供大家参考。
我的解密之路只限于穷举。因此后来是这么干的:
1. 生成6位字符的字典,以数字优先;
2. VB写了个小程序,依次生成对应字符的加密字符;
3. 搜索一下我要查询的加密的字符串--还真有!

至于从密码学的角度,怎么求逆,有兴趣的可以继续讨论一下。
2012-1-31 13:22
0
雪    币: 58
活跃值: (28)
能力值: ( 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),往后依次求取第二个明文字符、第三个.......
2012-1-31 14:36
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我看了 http://blog.csdn.net/babyt/article/details/91691,跟我想的思路大体一样,原来这个算法还在不少地方用过呢。
你原来的暴力穷举法就属于非密码学意义上的解决方法,对于比较复杂的口令显然是无效的。现在分析的破译方法的时间复杂度是多少呢?估计如下:
对于每个明文字符的求解,其实都是查表,故为常数时间O(1)。
对长为2n的密文,总的破译时间大约是O(n),考虑到可能在查表中遇到几个情况,故实际时间要多一些,但肯定不会多很多,因此求逆是极快的,基本不会有慢的感觉,与暴力破解相比。
2012-1-31 14:54
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
14
不是单射,会逆出很多结果,比如密文>:h7%Kn*(=C+对应下面任意明文组合

[['`', 'a'], ['b', 'j', 'f', '^'], ['c', 'k', '[', 'S'], ['1', '3', '/'], ['"', '2', '*'], ['3']]

密文是明文,前一位密文,最后一位明文的函数

先穷举最后一位明文再求逆别的密文即可
2012-1-31 16:40
0
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=forgot;1041171]不是单射,会逆出很多结果,比如密文>:h7%Kn*(=C+对应下面任意明文组合

[['`', 'a'], ['b', 'j', 'f', '^'], ['c', 'k', '[', 'S'], ['1', '3', '/'], ['"', '2', '*'], ['3']]

密文是明文...[/QUOTE]

其实并不需要求取所有原像,只要一个即可,对于身份认证都是等价的。
2012-1-31 20:23
0
游客
登录 | 注册 方可回帖
返回
//