一个简单BASE4加解密算法
本文最后更新于42天前,其中的信息可能已经有所发展或是发生改变。

写这个脚本的原因是一道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}

实现

  1. 将原始字符转为二进制数据,然后将二进制数据分为每 2 个比特为一组。长度不足 2 位的末尾补 0。
  2. 得到的数据每次取出 4 个二进制数字。将这 4 个数字转换成一个 0~3 之间的数,表示对应的字符。
  3. 将得到的字符串连接起来,作为编码后的结果。
  4. 解码反之。
#!/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 字符
​

索引表

二进制十进制字符
000B
011∀
102S
113∃

点击数:12

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇