NSSCTF_非常简单的逻辑题

在这里插入图片描述
下载,是个python文件,打开,很明显要写解密脚本
在这里插入图片描述

一、加密逻辑先理清楚

这是一个单字符拆双字符查表的加密算法,核心规则:

  1. 每个明文字符的 ASCII 码,拆成「除以 17 的商 s1」和「除以 17 的余数 s2」两部分
  2. 结合当前字符下标 i,分别计算两个索引,在这里插入代码片去字符表 s 里取出两个字符
  3. 每个明文字符加密后变成 2 个密文字符,密文总长度是明文的 2 倍

加密公式:

idx1 = (s1 + i) % 34
idx2 = -(s2 + i + 1) % 34
密文字符对 = s[idx1] + s[idx2]

二、解密思路(反向推导)

解密就是把密文每 2 个字符分成一组,反向算出原始 ASCII 码:

  1. 找到两个密文字符在 s 表里的索引 idx1idx2
  2. 反向公式还原 s1s2
    • s1 = (idx1 - i) % 34
    • s2 = (-idx2 - i - 1) % 34
  3. 原始 ASCII 码 = s1 * 17 + s2,转成字符就是明文

写解密脚本:

# 加密用的字符表
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
# 已知的密文(注释里的结果)
cipher = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'

flag = ""
# 密文每2个字符对应1个明文字符
for i in range(len(cipher) // 2):
    # 取出第i组的两个密文字符
    c1 = cipher[2 * i]
    c2 = cipher[2 * i + 1]
    
    # 找到两个字符在s中的索引
    idx1 = s.index(c1)
    idx2 = s.index(c2)
    
    # 反向计算 s1 和 s2
    s1 = (idx1 - i) % 34
    s2 = (-idx2 - i - 1) % 34
    
    # 还原ASCII码,转成字符
    plain_ord = s1 * 17 + s2
    flag += chr(plain_ord)

print("解密得到的flag:", flag)

运行得到在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值