wintop 发表于 2020-7-31 15:31

看不懂这个算法,求大佬支援啊

本帖最后由 wintop 于 2020-8-2 14:24 编辑

一个pb算法。下面是解码函数,求帮忙写出加密函数。
解法说明:
已经在写算法了,有点烧脑。
写下思路。
https://www.52pojie.cn/forum.php ... &page=2#pid33329031,从下往上推。

已解决:
本来打算用爆破模式来,发现太废劲,36*36....几万万亿 了,用php 和易语言算了下,10W次差不多10秒。只能逆向算法。

解密('QJWDMBP4IS)=>6v8v8pn58v

加密('6v8v8pn58v') =>QJWDMBP4IS

算法不打算写出来了,鄙人php写算法弄的太乱,怕影响各位学习。
说下思路:
逆向上推,最主要的就是 在11位的时候,左边第一位和上面的for 循环 判断 最后一位的 pos。












悬赏在这里https://www.52pojie.cn/thread-1235151-1-1.htmlpublic function string uf_decode(string as_input)

string ls_beg
string ls_end
string ls_str
long li_lenbeg
long li_lenstr
long i
long li_pos
long li_off
long j
long li_leninp


as_input = lower(as_input)
if len(as_input) < 3 then
      return ""
end if
ls_str ="abcdef012wxyz345mnopqr6789ghijklstuv"
li_lenstr = len(ls_str)
li_leninp = len(as_input)
ls_beg = as_input
for j = 1 to li_leninp
      ls_end = ""
      li_lenbeg = len(ls_beg)
      li_pos = pos(ls_str,mid(ls_beg,li_lenbeg,1))
      li_off = pos(ls_str,mid(ls_beg,li_lenbeg - 1,1))
      if li_pos = 0 or li_off = 0 then
                return ""
      end if
      li_pos = li_pos - li_off
      if li_pos < 1 then
                li_pos = li_pos + li_lenstr
      end if
      li_pos = li_pos * 2
      if li_pos > li_lenstr then
                li_pos = li_pos - li_lenstr
      end if
      ls_beg = mid(ls_str,li_pos,1) + ls_beg
      li_lenbeg = len(ls_beg)
      for i = li_lenbeg to 2 step -1
                li_pos = pos(ls_str,mid(ls_beg,i,1))
                li_off = pos(ls_str,mid(ls_beg,i - 1,1))
                if li_pos = 0 or li_off = 0 then
                        return ""
                end if
                li_pos = li_pos - li_off
                if li_pos < 1 then
                        li_pos = li_pos + li_lenstr
                end if
                ls_end = mid(ls_str,li_pos,1) + ls_end
      next
      ls_end = right(ls_end,1) + left(ls_end,len(ls_end) - 1)
      ls_beg = ls_end
next
return ls_end

wintop 发表于 2020-7-31 16:02

Light紫星 发表于 2020-7-31 15:43
你这个是什么语言,php吗?我测试好像报错

power building 。php 我还在一点点的啃它到底算法。贴给你下
function uf_decode($input){
        $input = strtolower($input);
        if(strlen($input) < 3){
                return "";
        }
        $key ="abcdef012wxyz345mnopqr6789ghijklstuv";
        $li_lenstr = strlen($key);
        $len_input = strlen($input);
        $ls_beg = $input;
        for($j = 1;$j<=$len_input;$j++){//< or <=序列号每一个都要处理
                $return_add = "";
                $li_lenbeg = strlen($ls_beg);//初始值是序列号,后期会增加
                $li_pos = pb_pos($key,mid($ls_beg,$li_lenbeg,1)); //mid(序列号_增加,序列号_增加_长度,1)
                $li_off = pb_pos($key,mid($ls_beg,$li_lenbeg - 1,1));
                if($li_pos == 0 || $li_off == 0){
                        return "";
                }
                $li_pos = $li_pos - $li_off;
                if($li_pos < 1){
                        $li_pos = $li_pos + $li_lenstr;
                }
                $li_pos = $li_pos * 2;//2
                if($li_pos > $li_lenstr){
                        $li_pos = $li_pos - $li_lenstr;
                }
                $ls_beg = mid($key,$li_pos,1) . $ls_beg;//b.input
                $li_lenbeg = strlen($ls_beg);//11
                for($i = $li_lenbeg;$i<=2;$i--){
                        $li_pos = pb_pos($key,mid($ls_beg,$i,1));
                        $li_off = pb_pos($key,mid($ls_beg,$i - 1,1));
                        if($li_pos == 0 || $li_off == 0){
                                return "";
                        }
                        $li_pos = $li_pos - $li_off;
                        if($li_pos < 1){
                                $li_pos = $li_pos + $li_lenstr;
                        }
                        $return_add = mid($key,$li_pos,1) . $return_add;
                }
                $return_add = right($return_add,1) . left($return_add,strlen($return_add) - 1);
                $ls_beg = $return_add;
        }
        return $ls_end;
}

function pb_pos($str,$find){
        $r = strpos($str,$find);
        if($r!==false){
                return ($r+1);
        }else{
                return 0;
        }
}
function mid($str,$start,$length){
        return substr($str,$start-1,$length);
}
function left($str,$len){
        return substr($str,0,$len);
}
function right($str,$len){
        return substr($str,0-$len);
}
exit;
?>

wintop 发表于 2020-8-1 17:51

本帖最后由 wintop 于 2020-8-1 18:15 编辑

抽出时间,进行测试。
随便输入10位字符,进行解密(0138892513)
观察里面的数据情况,10位字符需要运行的数据产生,如下
ls_beg=y0138892513
6--f
28--hf
7--0hf
19--o0hf
1--ao0hf
36--vao0hf
11--xvao0hf
6--fxvao0hf
1--afxvao0hf
31--kafxvao0hf
return_add:kafxvao0hf

ls_beg=ffkafxvao0h
21--q
24--7q
18--n7q
1--an7q
25--8an7q
5--e8an7q
5--ee8an7q
6--fee8an7q
25--8fee8an7q
36--v8fee8an7q
return_add:v8fee8an7q

ls_beg=yqv8fee8an7
6--f
17--mf
12--ymf
20--pymf
36--vpymf
35--uvpymf
17--muvpymf
25--8muvpymf
15--48muvpymf
9--248muvpymf
return_add:248muvpymf

ls_beg=wf248muvpym
5--e
28--he
20--phe
1--aphe
18--naphe
28--hnaphe
10--whnaphe
6--fwhnaphe
3--cfwhnaphe
32--lcfwhnaphe
return_add:lcfwhnaphe

ls_beg=5elcfwhnaph
8--1
19--o1
19--oo1
26--9oo1
18--n9oo1
4--dn9oo1
3--cdn9oo1
7--0cdn9oo1
27--g0cdn9oo1
25--8g0cdn9oo1
return_add:8g0cdn9oo1

ls_beg=v18g0cdn9oo
36--v
29--iv
8--1iv
14--31iv
1--a31iv
32--la31iv
16--5la31iv
2--b5la31iv
17--mb5la31iv
8--1mb5la31iv
return_add:1mb5la31iv

ls_beg=fv1mb5la31i
21--q
30--jq
13--zjq
5--ezjq
16--5ezjq
14--35ezjq
21--q35ezjq
9--2q35ezjq
8--12q35ezjq
30--j12q35ezjq
return_add:j12q35ezjq

ls_beg=tqj12q35ezj
17--m
8--1m
25--81m
2--b81m
29--ib81m
12--yib81m
1--ayib81m
14--3ayib81m
9--23ayib81m
23--623ayib81m
return_add:623ayib81m

ls_beg=bm623ayib81
19--o
23--6o
9--26o
17--m26o
11--xm26o
23--6xm26o
5--e6xm26o
22--re6xm26o
6--fre6xm26o
15--4fre6xm26o
return_add:4fre6xm26o

ls_beg=ho4fre6xm26
14--3
28--h3
6--fh3
24--7fh3
18--n7fh3
19--on7fh3
16--5on7fh3
27--g5on7fh3
32--lg5on7fh3
27--glg5on7fh3
return_add:glg5on7fh3

3glg5on7fh
经过研究,发现解密的程序并不麻烦,也即是说加密的算法并不麻烦,也是需要这100步骤,并且每一步要获取字符串在key 中的位置。

Light紫星 发表于 2020-7-31 15:43

你这个是什么语言,php吗?我测试好像报错

Light紫星 发表于 2020-7-31 15:44

能否给几个加密-解密对应的字符串,我改用Python写出对比一下

wintop 发表于 2020-7-31 16:21

本帖最后由 wintop 于 2020-7-31 16:24 编辑

Light紫星 发表于 2020-7-31 15:44
能否给几个加密-解密对应的字符串,我改用Python写出对比一下
6v8v8pn58
上面这个是加密后,要用decode(某个字符串) 去解密成6v8v8pn58

decode函数在上面出来了,所以想做一个encode 函数。

rosemaryzed 发表于 2020-7-31 16:37

为什么这个代码看起来好像VB的{:1_900:} 算法不太行 看大佬们操作

cola_ 发表于 2020-7-31 16:38

一脸懵,{:1_926:}

wintop 发表于 2020-7-31 16:45

[url=forum.php?mod=redirect

别,都是一步一步学习进步的

wintop 发表于 2020-7-31 16:46

[url=forum.php?mod=redirect

算法而已,是pb代码

Light紫星 发表于 2020-7-31 22:10

wintop 发表于 2020-7-31 16:21
6v8v8pn58
上面这个是加密后,要用decode(某个字符串) 去解密成6v8v8pn58



你给一个加密后的字符串啊,不然也没法测试呢
页: [1] 2
查看完整版本: 看不懂这个算法,求大佬支援啊