web2 攻防世界

源码

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
    $_o=strrev($str);
    // echo $_o;
        
    for($_0=0;$_0<strlen($_o);$_0++){
       
        $_c=substr($_o,$_0,1);
        $__=ord($_c)+1;
        $_c=chr($__);
        $_=$_.$_c;   
    } 
    return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);
/*
   逆向加密算法,解密$miwen就是flag
*/
?>

题目已给提示,逆向加密算法,解密$miwen

strrev() 函数反转字符串。
substr(string,start,length)函数返回字符串的一部分,字符串下标从0开始。
如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
ord() 函数返回字符串中第一个字符的 ASCII 值。

都是返回h的ASCII值 

chr() 函数从指定 ASCII 值返回字符。

ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,十六进制值被定义为带前置 0x。
str_rot13() 函数对字符串执行 ROT13 编码。

ROT13 编码是把每一个字母在字母表中向前移动 13 个字母得到。数字和非字母字符保持不变。

编码和解码都是由相同的函数完成的。如果传入为一个已编码的字符串,那么将返回原始字符串。

 既然逆向,那么解密就是反着来,先建一个测试函数看下

<?php
echo ord("h");//输出h的ASCII值
echo "\n";
$a=ord("h")+1;//h的ASCII值+1
echo $a;
echo "\n";
$b=chr($a);//变回字符i(h的下一位)
echo $b;
echo "\n";
$c=ord($b);//验证字符i的ASCII值是否==ord("h")+1
echo $c;
echo "\n";
$d=ord($b)-1;//变回h的ascii值
echo $d;
echo "\n";
echo chr($d);//变回h
?>

输出结果

 查看源代码中的加密函数

function encode($str){//$str(-->首尾)
    $_o=strrev($str);//$str翻转(-->尾首)
    // echo $_o;
        
    for($_0=0;$_0<strlen($_o);$_0++){//遍历逆转后的$str的每个字符
       
        $_c=substr($_o,$_0,1);
        $__=ord($_c)+1;//字符的ASCII值+1
        $_c=chr($__);//变成原字符的下一位字符
        $_=$_.$_c; //新的字符连接成一个新的字符串 
    } 
    return str_rot13(strrev(base64_encode($_)));//对新的字符串进行64编码,然后再翻转(-->首尾),进行str_rot13,把每一个字母在字母表中向前移动 13 个字母并返回
}

 如果运行,要定义$_="",不然会报错

 

 反着来,解密函数为

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function decode($str){$str(-->首尾)
    $a=str_rot13($str);//加密函数中,字符在字符表中往前移动13位,还原还是用str_rot13
    $c=strrev($a);//翻转(-->尾首)
    $_o=base64_decode($c);//64解码
    //以上对应加密函数中的return部分
    // echo $_o;
    //在加密函数中,ford遍历的上面有反转,这里先不反转,要等复原后再反转
        $_ = "";
    for($_0=0;$_0<strlen($_o);$_0++){
       
        $_c=substr($_o,$_0,1);
        $__=ord($_c)-1;//ASCII值是原字符的下一位的ACSII值,那获取原字符ASCII值就是要-1
        $_c=chr($__);//得到原字符
        $_=$_.$_c;  //拼接
    } 
    return strrev($_);//翻转(-->首尾)
}
echo decode($miwen);//解密$miwen

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值