一个比较刁钻的算法问题解密
本帖最后由 lanfengc 于 2014-5-22 08:11 编辑群里有人提出这个问题
求解a、b和结果三者之间的算法或规则
a=qWaYmA,,b=6
a=qWeYmA,,b=7
a=qWJhmw,,b=21
a=qWJomw,,b=28
a=qWZkmw,,b=64
a=qWZlmw,,b=65
a=qWZmmw,,b=66
a=qWZpmw,,b=69
a=qWdmmw,,b=76
a=qWhjmw,,b=83
a=qWlnmw,,b=97
结果=6003
a=qWWYmQ,,b=5
a=qWaYmQ,,b=6
a=qWFinA,,b=12
a=qWFknA,,b=14
a=qWJjnA,,b=23
a=qWJnnA,,b=27
a=qWNjnA,,b=33
a=qWNpnA,,b=39
a=qWRlnA,,b=45
a=qWRonA,,b=48
a=qWVlnA,,b=55
a=qWdjnA,,b=73
a=qWdonA,,b=78
a=qWlgnA,,b=90
a=qWlhnA,,b=91
a=qWVonA,,b=58
结果=6004
a=qWWYmg,,b=5
a=qWaYmg,,b=6
a=qWJjnQ,,b=23
a=qWNgnQ,,b=30
a=qWNmnQ,,b=36
a=qWRpnQ,,b=49
a=qWVhnQ,,b=51
a=qWVonQ,,b=58
a=qWdjnQ,,b=73
a=qWhlnQ,,b=85
结果=6005
算法(规则)是别人用php写的,我研究了几天解不出来,大家可以看看哦。
求解a、b和结果三者之间的算法或规则,解出来还有100元新年红包哦。
我写了个辅助验证器:http://www.ipdizhi.com/ss1.php
由于本人不懂PHP代码, 所以那天分析了半个小时,没有给出具体的解决办法, 只是给出了思路. 现在有个PHP的达人把PHP版的解密函数搞出来了, 我看了看,然后又百度了1小时, 改成AU3版本的,现在发出来给各位坛友借鉴.
PHP原版页面:http://cn.v2ex.com/t/99120
AU3版解密函数代码发布过一次. 但是应提问者要求,暂时不公开代码. 所以把下面的代码编辑掉了.求斑竹给这帖子删除了吧. 或者留着帖子等以后我公布出来吧.
本人写的解密函数的结果图片
#Include <ACN_HASH.au3>
#include <array.au3>
$a = 'pWFqbWGalak'
$b = '1991'
MsgBox(0,"解密结果:",'$a='&$a&@CRLF&'$b='&$b&@CRLF&'$Result='&DecodeByFengzi($a,$b))
ConsoleWrite(DecodeByFengzi('qWaYmA',6)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWeYmA',7)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWJhmw',21)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWJomw',28)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWZkmw',64)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWZlmw',65)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWZmmw',66)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWZpmw',69)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWdmmw',76)&@CRLF)
ConsoleWrite(DecodeByFengzi('qWhjmw',83)&@CRLF)
Func DecodeByFengzi($a,$b)
If $a='' Or $b='' Then Return ''
;如果a的位数不是偶数位,则后面补零再解码
If Mod(StringLen($a),2)<>0 Then
$str = StringTrimRight(StringTrimLeft(_Base64Decode($a&'0=='),2),2)
Else
$str = StringTrimLeft(_Base64Decode($a&'=='),2)
EndIf
;取出b的数字部分
$b = String(Int($b))
;将解密结果输出核对
;~ ConsoleWrite("Decoded: "&$str&@CRLF)
;获取结果字符数量
$str_length=Int(StringLen($str)/2)
;如果a的位数为奇数, 则证明最后一位是附加的. 不处理
If Mod(StringLen($a),2)<>0 Then $str_length=$str_length-1
;重定义数组存放结果数据
Dim $str_array[$str_length]
;将解密结果每两位分割并赋值给结果数组
For $i=1 To $str_length
$str_array[$i-1]=Int('0x'&StringLeft($str,2))
$str=StringTrimLeft($str,2)
Next
;对第一位解密第一位ASCII码减去 115
$str_array = chr(Int($str_array) - 115)
;定义b无效时候的密钥表
Local $keyNumber =
Local $j = 0 , $result=$str_array
; 从第二位开始循环处理
For $i = 1 To $str_length-1
;按位取出b的ASC码值
$b_chr = Asc(StringLeft($b,1))
$b=StringTrimLeft($b,1)
;如果b的asc码有效 则用b的asc码做参数 否则从密钥表中取
If $b_chr Then
;b有相应的值,则减去其ascii码值
$str_array[$i] = chr($str_array[$i] - $b_chr)
Else
;从一个密钥表里循环取值并减去
$str_array[$i] = chr($str_array[$i] - $keyNumber)
$j=$j+1
EndIf
$result&=$str_array[$i]
Next
;将结果数组显示出来
;~ _ArrayDisplay($str_array)
;输出结果用于查看
;~ ConsoleWrite($result&@CRLF)
Return $result
EndFunc
强大的楼主分析,学习了。 强大的逻辑能力 强大的看不懂。。。 太高深,看不懂了 好吧,我看不懂~ 不知所云。 这个算法太难了...唉 不懂啊!
这个有什么实际用途?{:face (131):}
页:
[1]