已知除数和余数,如何求被除数?
原代码是这样的:$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循环一个数一个数去代入外,在已知除数和余数以及被除数的范围条件下,有没有更简便的算法求出被除数?求达人指点。
$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
迭代倒是简单,不过效率实在是...郁闷... y=ax+b,这不可能是单解,肯定是个方程,出来的应该是条直线上当x为整数的点 呃,蛋大,是已知被除数区间的...昨天百度了下模逆运算,貌似整的很深奥,非数学专业看不懂的说... 蛋大正解
看不明白,明明是数值为什么用字符串? 回复 5# seniors
这是一个软件的密码存储算法,顶楼的代码就是模拟这个算法,取明文密码的字符的ascii码数值乘以2的该字符所处位数次幂,再对255求模,再计算其反码,各位的运算结果组合之后,转成UNICODE代码,存储到数据库,现在我想实现的是通过数据库中的加密密码反推出明文密码,目前是通过2楼的迭代算法来逆运算的,不过效率很低,单个计算问题不大,如果是十几万行的数据,处理起来就悲剧了,所以想求下有没有好的算法... 本帖最后由 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)的话,虽然不是你那串数字,但是结果应该也是对的.而且出错的几率小很多. 这个算法有很多重复的,乘2的n次方就是左移n位,255取模就是 &=0xff,所以取模可以不用管,然后如果算出来的 ...
www378660084 发表于 2014-2-18 16:37 http://www.autoitx.com/images/common/back.gif
谢谢LS,貌似要去找出跟那个值进行BitOR运算这个不容易吧...另外"255取模就是 &=0xff"这句是啥意思?求LS大大解释一二...{:face (396):} 回复 7# www378660084
今天重新回过头来看,发现LS的算法也有问题,如果$chr="3B9BCCE5B2398C3E1B9F",运行出来的结果是0000167890,BitShift(255-dec($code),$i)当$i>8的时候,位移运算后结果都是0
页:
[1]