本文最后更新于536天前,其中的信息可能已经有所发展或是发生改变。
写这个脚本的原因是一道CTF题目
题目
题目名称
B∀S∃4
描述
["B","∀","S","∃"]
密文
∀S∀S∀S∃B∀SB∀∀S∀∃∀∃S∃∀∀∀B∀SSBB∃∀B∀∀∀B∀∀∃∃∀∃∀∃B∃B∀∀S∃B∀B∃B∀∀∃∃∀BBSB∃B∃∀∀∃∃∀SSB∀SB∀∀∀BS∀B∀B∀∀∃∃∀B∀∀∀S∃SB∃BB∀∃∀∀∀S∀∃∀BSB∀∃∃∀
FLAG
flag{Th4T_w1lL_B3_haRD_En0ugH}
实现
- 将原始字符转为二进制数据,然后将二进制数据分为每 2 个比特为一组。长度不足 2 位的末尾补 0。
- 得到的数据每次取出 4 个二进制数字。将这 4 个数字转换成一个 0~3 之间的数,表示对应的字符。
- 将得到的字符串连接起来,作为编码后的结果。
- 解码反之。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author:Mondayice
# @Date 2023年04月23日
#
import re
def base4_encode(data):
# 将二进制数据分组
groups = [data[i:i + 2] for i in range(0, len(data), 2)]
# 补齐末尾不足 2 位的数据
if len(groups[-1]) < 2:
groups[-1] += '0'
# 转换成 base4 码
codes = []
for group in groups:
codes.append(str(int(group, 2)))
# 转换成对应字符
result = ''.join(['B∀S∃'[int(c)] for c in codes])
return result
def base4_decode(code):
# 转换为对应数字
codes = [str('B∀S∃'.index(c)) for c in code]
# 转换为二进制
groups = []
for c in codes:
binary = bin(int(c))[2:]
groups.append('0' * (2 - len(binary)) + binary)
# 拼接得到原始二进制数据
data = ''.join(groups)
return data
data = '110111010010001111101110' # 原始测试数据
data2 = "0110011001101100011000010110011101111011010101000110100000110100010101000101111101110111001100010110110001001100010111110100001000110011010111110110100001100001010100100100010101111101000101011011100011000001110101011001110100100001111101"
code = base4_encode(data) # 编码后得到的字符串
print(code) # 输出编码结果
# 测试结果 ∃∀∃∀BSB∃∃S∃S
code2 = "∀S∀S∀S∃B∀SB∀∀S∀∃∀∃S∃∀∀∀B∀SSBB∃∀B∀∀∀B∀∀∃∃∀∃∀∃B∃B∀∀S∃B∀B∃B∀∀∃∃∀BBSB∃B∃∀∀∃∃∀SSB∀SB∀∀∀BS∀B∀B∀∀∃∃∀B∀∀∀S∃SB∃BB∀∃∀∀∀S∀∃∀BSB∀∃∃∀" # 实际待处理密文。。。。。。
decoded_data = base4_decode(code2) # 解码得到的二进制数据
print(decoded_data) # 输出解码结果
# 测试结果 110111010010001111101110
binary_list = re.findall('.{8}', decoded_data) # 将字符串按照每8位分割为多个块
if len(decoded_data) % 8 != 0: # 如果最后一个块长度不足8,需要在末尾补上0
last_block = decoded_data[-(len(decoded_data) % 8):].ljust(8, '0')
binary_list.append(last_block)
print(binary_list) # 输出分割后的二进制块列表
res = ""
for i in binary_list:
decimal_num = int(i, 2) # 转为十进制整数
ascii_char = chr(decimal_num) # 转为对应的 ASCII 字符
res = res + ascii_char
print(res) # 输出 ASCII 字符
索引表
二进制 | 十进制 | 字符 |
---|---|---|
00 | 0 | B |
01 | 1 | ∀ |
10 | 2 | S |
11 | 3 | ∃ |
点击数:35