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

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

点击数:34

    暂无评论

    发送评论 编辑评论

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