BUUCTF之Crypto题目:[BJDCTF2020]这是base??

本文介绍了Base64编码的工作原理,通过ASCII码转二进制,再按6位一组转换为十进制并应用base64码值表。给出了一个Python示例,如何通过重新定义的字符映射表将非标准Base64编码解码回明文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一  在做题之前我们先了解一下什么是base64编码

base64编码类似ASCLL编码

ASCLL使用7个二进制位来表示一个字符,7个二进制位刚好可以表示128个不同的字符,如图

而base64编码使用6个二进制位表示一个字符

6个二进制位可以表示64个不同的字符,如图

现在我们来解释base64编码,我们先将一个对象先由ascii码转化为二进制(7个二进制一组),然后再将它们以6个为一组(不足用0补齐),然后转化为十进制,再通过十进制的数字和base64的码值表相互转换得到对应的字符,最后的base64的结果需要是4的倍数,不足用=补齐。

二 解题

由题目可知这里重新定义了base64,(如这里的0表示j,而原本的0表示A)

所以通过base64的原理写出代码:

import base64

dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='    #标准表

c='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'

ds=''  #把dict转换成字符串方便处理
for i in range(65):
    ds+=dict[i]

l=[]
for i in range(len(c)):
    l.append(ds.index(c[i]))  #无论换不换表,base64变换本身产生的6位二进制数对应的十进制数是不变的,这里就是找到密文c的每个字符在dict表中键值

#print(l)  #l中存的是索引值(下标数字)

m1=''
for ll in l:
    m1+=a[ll]  #找到l中所存的每个数字在标准的base64加密表中所对应的字符
print(m1)  #m1是标准base64表编码结果

m2=base64.b64decode(m1)  #直接调用函数恢复出明文
print(m2)

得到结果

将BJD换为flag即可。

### 使用Base64加密解决由01构成的Crypto题目 在处理由`01`构成的Crypto题目时,可以利用Base64编码作为中间步骤来转换数据形式。以下是具体的方法: #### 方法概述 Base64是一种基于64个可打印字符的二进制到文本的编码方案。它通常用于在网络协议中传输二进制数据[^2]。由于其特性,可以通过以下流程实现对`01`字符串的处理。 1. **将`01`字符串分组并映射至ASCII字符集** 将输入的`01`字符串按每8位一组分割(因为一个字节等于8比特),并将每一组视为一个二进制数。随后将其转化为对应的十进制数值,并通过ASCII表找到相应的字符。 2. **应用Base64编码** 对上述得到的ASCII字符串执行Base64编码操作,从而获得最终的结果。 3. **逆向解码过程** 若要还原原始的`01`字符串,则需先进行Base64解码恢复成ASCII字符串,再逐一分割为单个字符并通过ASCII表反查回二进制表示。 #### 实现代码示例 下面提供了一个Java版本的例子展示这一逻辑: ```java import java.util.Base64; public class CryptoProcessor { public static String binaryToAscii(String binStr) { StringBuilder result = new StringBuilder(); for(int i=0;i<binStr.length();i+=8){ int decimalValue = Integer.parseInt(binStr.substring(i, Math.min(i+8, binStr.length())), 2); char asciiChar = (char)decimalValue; result.append(asciiChar); } return result.toString(); } public static String encodeToBase64(String input){ return Base64.getEncoder().encodeToString(input.getBytes()); } public static void main(String[] args){ String binaryString="0110100001100101011011000110110001101111"; //hello in binary String asciiString=binaryToAscii(binaryString)[^1]; String encodedString=encodeToBase64(asciiString)[^2]; System.out.println("Original Binary:"+binaryString); System.out.println("Converted ASCII:"+asciiString); System.out.println("Encoded Base64:"+encodedString); } } ``` 此程序首先定义了两个主要功能函数:一个是把二进制串转化成ASCII字符串;另一个是对该ASCII字符串做Base64编码。最后,在主函数里演示整个流程。 #### 注意事项 - 输入的`01`字符串长度应能被8整除,否则需要补全使其满足条件。 - 转化过程中可能出现不可见字符或者特殊符号,请依据实际需求决定是否过滤掉这些字符。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值