密码学 骚年来一发吗(分值250)
2017-10-22 本文已影响0人
Cytosine
解题过程
原题加密函数,窝已经给出详尽注释了:
function encode($str){
$_o = strrev($str); //strrev — 反转字符串
for ($_0=0; $_0 < strlen($_o); $_0++) {
$_c = substr($_o, $_0, 1); //返回第$_0个字符
$__ = ord($_c)+1; //返回ASCII码,然后把ASCII码加一
$_c = chr($__); //得到相应字符
$_ = $_.$_c; //改变后的单个字符接到后面
}
return str_rot13(strrev(base64_encode($_)));
// 先取base64
// 再反转
// str_rot13,翻阅php手册得到下面信息:
// string str_rot13 ( string $str )
// 对 str 参数执行 ROT13 编码并将结果字符串返回。
// ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。编码和解码都使用相同的函数,传递一个编码过的字符串作为参数,将得到原始字符串。
}
所以,容易得出对应的解密函数:
function decode($a){
// x先解码rot13,再转置,最后base64解码:
$b = base64_decode(strrev(str_rot13($a)));
//取单个字符进行反加密:
for ($i=0; $i < strlen($b); $i++) {
$char = substr($b, $i, 1);//得到单个字符
$char = chr(ord($char)-1);//取得ASCII码,然后减一,再得到字符
$result = $result.$char;//字符串连接
}
//反转字符串:
$result = strrev($result);
return $result;
}
所以,可得flag为nctf{rot13_and_base64_and_strrev}