bugku-decrypt

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值