楼主: 何丽娇
1569 0

[其他] 初学RE day06(解 简简单单的解密) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-5-26
最后登录
2018-5-26

楼主
何丽娇 发表于 2025-11-24 15:08:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

该文件为 Python 脚本,可使用 PyCharm 打开进行查看与编辑。

从代码分析可知,此程序实现了 RC4 加密算法,并未结合 Base64 编码进行加密处理。那么为何不采用 Base64?实际上,Base64 主要用于将二进制数据转换为可打印字符以便传输,而 RC4 本身输出的是字节流,是否编码取决于应用场景。此处仅需理解 RC4 的基本原理即可。

下面简要介绍标准 RC4 算法的核心流程:

1. 输入数据获取

  • 明文消息:待加密的原始信息
  • get_message()
  • 加密密钥:用于生成密钥流的密钥输入
  • get_key()

2. S盒初始化

RC4 的核心之一是通过密钥对 S 盒(S-box)进行初始化。该过程包括以下步骤:

  • 创建一个长度为 256 的数组 s_box,初始值为 0 到 255 的顺序排列
  • 利用密钥中的字节对 s_box 进行置换,实现混淆效果

这一过程可通俗理解为:将密钥与初始状态表混合,生成一个伪随机排列的 S 盒。

box = init_box(key)

3. 执行加解密操作

在完成 S 盒初始化后,进入 PRGA(伪随机生成算法)阶段,生成密钥流并与明文或密文字节逐个异或。

  • 调用加密函数,开始逐字节处理
  • 每轮更新索引 i 和 j,交换 s_box 中的元素,生成密钥流字节 k
  • 将当前字符与密钥流字节进行异或运算,得到结果字符
ex_encrypt(message, box, mode)

4. 输出结果形式

加密完成后,系统会输出以下内容:

  • 原始密文(可能包含不可见或非打印字符)
  • 经过 Base64 编码后的密文(便于显示和传输的字符串)
  • 部分场景下还进行了 URL 编码处理

RC4 算法特性说明

RC4 属于对称加密算法中的流密码类型,具有如下特点:

  1. 采用字节流方式处理数据,不对明文进行分组,而是逐字节加密;解密时同样按字节还原,无需额外模式支持。
  2. 算法结构简单,执行效率高,适合资源受限环境运行,且支持可变长度密钥。
  3. 作为流密码,RC4 不直接加密明文块,而是基于密钥生成等长的密钥流,再通过异或操作完成加解密。其安全性依赖于 S 盒的非线性变换和密钥流的随机性。
  4. 由于其对称性,同一算法既可用于加密也可用于解密——只需将密文再次与相同密钥流异或即可恢复明文。

代码实现示例

# -*- coding: utf-8 -*-
import base64

def get_message():
    print("输入你的信息: ")
    s = input()
    return s

def get_key():
    print("输入你的密钥: ")
    key = input()
    if key == '':
        key = "不要输入空的 key 值"
    return key

def init_box(key):
    """
    初始化 S 盒
    """
    s_box = list(range(256))
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box

def ex_encrypt(plain, box, mode):
    """
    使用 PRGA 生成密钥流并进行异或运算,实现加解密一体化
    """
    if mode == '2':
        while True:
            c_mode = input("输入你的解密模式:base64 or ordinary\n")
            if c_mode == 'base64':
                plain = base64.b64decode(plain)
                plain = bytes.decode(plain)
                break
            elif c_mode == 'ordinary':
                break
            else:
                print("输入不合法,请重新输入")
                continue

    res = []
    i = j = 0
    for s in plain:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(ord(s) ^ k))

    cipher = "".join(res)

    if mode == '1':
        print("加密后的输出(没经过任何编码)")
        print(cipher)
        print("base64后的编码")
        print(str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
    elif mode == '2':
        print("解密后的密文")
        print(cipher)

def get_mode():
    print("请选择加密或者解密")
    print("1.Encrypt")
    print("2.Decrypt")
    mode = input()
if mode == '1':
    message = get_message()
    key = get_key()
    box = init_box(key)
    ex_encrypt(message, box, mode)
elif mode == '2':
    message = get_message()
    key = get_key()
    box = init_box(key)
    ex_encrypt(message, box, mode)
else:
    print("输入有误!")

if __name__ == '__main__':
    while True:
        get_mode()

上述代码中,尽管加密与解密过程来源于相同的算法逻辑,但由于无法直接通过 condition == '1' or '2' 的方式判断分支,因此需将两种模式分别处理。而RC4算法本身具备对合性,即异或运算的可逆特性,使得加解密可共用同一套核心流程。

接下来进入Python脚本编写阶段,整体思路如下:

  1. 首先对URL进行解码操作,使用 unquote 函数处理编码字符;
  2. 对已解码的 enc 数据再次执行 RC4 解密;
  3. 最终从结果中提取出 flag 信息。

根据输出结果可知,flag 位于返回内容的最底部位置。

至此,题目分析完毕,成功获取答案。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:简简单单 Day condition Ordinary continue

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-2-12 00:50