源码
<?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