decrypt
目录
题目描述
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
提 示: Flag:{xxx}
时间:2023年9月16日
类型:Web
WP
提取信息
下载题目所提供的的附件看到php源码:
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
代码分析
明显这是用与字符串加密的一个函数,要加密数据为 data,加密流程为:
- 先将“ISCC”进行md5加密,获得到一串长度32的字符串,这个是加密中的key
- 如果key长度比data短,那就从key最前面拿字符拼接到key后面。使key和data长度相同
- 再逐字符,一一对应地将data和key中的字符转变为ascii码,相加后再取余128,得到 运算后字符串str
- 最后将 运算后字符串str 进行base64编码,得到最终的 加密字符串
解密
加密过程并不复杂,就像复合函数一样,我们只需要按照加密流程反解即可得到原数据。具体步骤为:
- 先将加密字符串进行base64解码,得到运算后字符串str
- 再逐字符,一一对应地将 运算后字符串str和key中的字符转变为ascii码,相减。之前的加密操作是取余,本是无法反解的,但ASCII编码范围为0~127,所以如果相减后的ascii码小于0,那就再加上128就没问题了
- 最后得到源数据data
加密脚本
import base64
from hashlib import *
str_b64encode = 'fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA='#最终加密字符串
str_ori = str(base64.b64decode(str_b64encode), "utf-8") #运算后字符串str
key_str = md5('ISCC'.encode('utf-8')).hexdigest() #key
def decrypt(data, key):
x = -1 #x用于遍历字符串key
flag = ""
for i in range(len(data)): #i用来遍历字符串data
x += 1
x = 0 if i == len(key) else x #如果key遍历到结尾了,就从头继续遍历
c_ascii = ord(data[i]) - ord(key[x])
if c_ascii < 0: #如果相减小于0,说明源数据减了128,需要补回来
flag += chr(c_ascii + 128)
continue
flag += chr(c_ascii)
return flag
print(decrypt(str_ori, key_str))
得到flag
Flag:{asdqwdfasfdawfefqwdqwdadwqadawd}
参考资料
啥是模运算
a = (10 + 12) % 5
print(a) #2
b = (1 + 2) % 5
print(b) #3
def mo(num1, num2, m):
num_sum = num1 + num2
while num_sum > m:
num_sum -= m
return num_sum
a = mo(10, 12, 5)
print(a) #2
b = mo(1, 2, 5)
print(b) #3