看不懂这个算法,求大佬支援啊
本帖最后由 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
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 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 中的位置。 你这个是什么语言,php吗?我测试好像报错 能否给几个加密-解密对应的字符串,我改用Python写出对比一下 本帖最后由 wintop 于 2020-7-31 16:24 编辑
Light紫星 发表于 2020-7-31 15:44
能否给几个加密-解密对应的字符串,我改用Python写出对比一下
6v8v8pn58
上面这个是加密后,要用decode(某个字符串) 去解密成6v8v8pn58
decode函数在上面出来了,所以想做一个encode 函数。 为什么这个代码看起来好像VB的{:1_900:} 算法不太行 看大佬们操作 一脸懵,{:1_926:} [url=forum.php?mod=redirect
别,都是一步一步学习进步的 [url=forum.php?mod=redirect
算法而已,是pb代码 wintop 发表于 2020-7-31 16:21
6v8v8pn58
上面这个是加密后,要用decode(某个字符串) 去解密成6v8v8pn58
你给一个加密后的字符串啊,不然也没法测试呢
页:
[1]
2