找回密码
 加入
搜索
查看: 7904|回复: 8

[效率算法] 已知除数和余数,如何求被除数?

  [复制链接]
发表于 2014-2-16 15:01:14 | 显示全部楼层 |阅读模式
原代码是这样的:
$chr="123456"
$v="0x"
For $i=StringLen($chr) To 1 Step -1
        $code=255-Mod((Asc(StringMid($chr,StringLen($chr)+1-$i,1))*(2^$i)),255)
        $v&=Hex($code,2)
Next
MsgBox(1,"转换后字符为",BinaryToString($v,1))
现在要逆向运算,除了for next循环一个数一个数去代入外,在已知除数和余数以及被除数的范围条件下,有没有更简便的算法求出被除数?求达人指点。
 楼主| 发表于 2014-2-16 16:39:22 | 显示全部楼层
$chr="B3B9CC66379D"
$v=""
For $i=StringLen($chr)/2 To 1 Step -1
        $code=StringMid($chr,StringLen($chr)-$i*2+1,2)
        $v&=Chr(bmod(Dec($code),$i))
Next
MsgBox(1,"原字符串为",$v)        

Func bmod($v1,$v2)
        Local $r
        For $i=31 To 128
                If 255-Mod($i*(2^$v2),255)==$v1 Then
                        $r=$i
                        ExitLoop
                EndIf
        Next
        Return $r
EndFunc
迭代倒是简单,不过效率实在是...郁闷...
发表于 2014-2-17 04:38:26 | 显示全部楼层
y=ax+b,这不可能是单解,肯定是个方程,出来的应该是条直线上当x为整数的点
 楼主| 发表于 2014-2-17 15:33:06 | 显示全部楼层
呃,蛋大,是已知被除数区间的...昨天百度了下模逆运算,貌似整的很深奥,非数学专业看不懂的说...
发表于 2014-2-18 09:11:18 | 显示全部楼层
蛋大正解
看不明白,明明是数值为什么用字符串?
 楼主| 发表于 2014-2-18 14:20:10 | 显示全部楼层
回复 5# seniors

这是一个软件的密码存储算法,顶楼的代码就是模拟这个算法,取明文密码的字符的ascii码数值乘以2的该字符所处位数次幂,再对255求模,再计算其反码,各位的运算结果组合之后,转成UNICODE代码,存储到数据库,现在我想实现的是通过数据库中的加密密码反推出明文密码,目前是通过2楼的迭代算法来逆运算的,不过效率很低,单个计算问题不大,如果是十几万行的数据,处理起来就悲剧了,所以想求下有没有好的算法...
发表于 2014-2-18 16:37:34 | 显示全部楼层
本帖最后由 www378660084 于 2014-2-18 16:56 编辑


$chr="B3B9CC66379D"
$v=""
For $i=StringLen($chr)/2 To 1 Step -1
        $code=StringMid($chr,StringLen($chr)-$i*2+1,2)
        $t = BitShift(255 - Dec($code),$i)
        $t = BitOR($t,0x30)
        $v&=Chr($t)
Next
MsgBox(1,"原字符串为",$v)          


这个算法有很多重复的,乘2的n次方就是左移n位,255取模就是 &=0xff,所以取模可以不用管,然后如果算出来的结果小的话,随便对一个大点的数,取下或就行了,上面的代码就是对比较小的数和0x30或,保证结果大于'0',但是要注意,或的数不能覆盖有效位.所以,你可能要对$t = BitOR($t,0x30)这一步做个判断,改成$t = BitOR($t,0x40)的话,虽然不是你那串数字,但是结果应该也是对的.而且出错的几率小很多.
 楼主| 发表于 2014-2-23 16:14:07 | 显示全部楼层
这个算法有很多重复的,乘2的n次方就是左移n位,255取模就是 &=0xff,所以取模可以不用管,然后如果算出来的 ...
www378660084 发表于 2014-2-18 16:37

谢谢LS,貌似要去找出跟那个值进行BitOR运算这个不容易吧...另外"255取模就是 &=0xff"这句是啥意思?求LS大大解释一二...
 楼主| 发表于 2014-3-8 15:55:34 | 显示全部楼层
回复 7# www378660084


今天重新回过头来看,发现LS的算法也有问题,如果$chr="3B9BCCE5B2398C3E1B9F",运行出来的结果是0000167890,BitShift(255-dec($code),$i)当$i>8的时候,位移运算后结果都是0
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-1 07:46 , Processed in 0.075766 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表