lanfengc 发表于 2014-2-8 09:46:19

一个比较刁钻的算法问题解密

本帖最后由 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

zhongzijie 发表于 2014-2-8 10:16:48

强大的楼主分析,学习了。

haopp1 发表于 2014-2-8 16:48:22

强大的逻辑能力

不死帝国 发表于 2014-2-10 11:51:44

强大的看不懂。。。

hnfeng 发表于 2014-2-10 12:09:03

太高深,看不懂了

sniperone 发表于 2014-2-10 21:01:52

好吧,我看不懂~

无名小子188 发表于 2014-2-12 20:14:37

不知所云。

58fly 发表于 2014-2-13 05:28:38

这个算法太难了...唉

zhouflye 发表于 2014-2-13 21:15:46

不懂啊!

这个有什么实际用途?{:face (131):}
页: [1]
查看完整版本: 一个比较刁钻的算法问题解密