持续解码Base64直到没有Base64

1 投票
5 回答
4041 浏览
提问于 2025-04-16 05:55

我的问题其实很简单,我想把Base64编码解码,直到没有Base64编码为止。我用正则表达式检查是否还有Base64编码,但我不知道怎么解码,直到没有Base64编码。

在这段简短的代码中,我可以解码Base64,直到没有Base64编码,因为我的文本是固定的。(直到解码的内容不是“Hello World”)

# Import Libraries
from base64 import *
import re

# Text & Base64 String
strText = "Hello World"
strEncode = "VmxSQ2ExWXlUWGxUYTJoUVVqSlNXRlJYY0hOT1ZteHlXa1pLVVZWWE9EbERaejA5Q2c9PQo=".encode("utf-8")

# Decode
objRgx = re.search('^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$', strEncode.decode("utf-8"))

strDecode = b64decode(objRgx.group(0).encode("utf-8"))

print(strDecode.decode("utf-8"))

while strDecode != strText.encode("utf-8"):
    strDecode = b64decode(strDecode)

    print(strDecode.decode("utf-8"))

有没有人知道我该怎么做,才能一直解码Base64,直到得到真实的文本(没有更多的Base64编码)

顺便说一下,抱歉我的英语不好。

5 个回答

0

所以你在处理一段可能被多次进行base64编码的数据?那为什么不一直用b64decode()来解码这个字符串,直到出现错误为止呢?

另外,我觉得你可能不需要到处都加上.encode("utf-8")

2

作为一种简单的方法,你可以计算一下结果中单词的平均长度。自然语言中会有一些短单词,比如“作为一种简单的方法,你可以看看单词的长度。”而一个仍然是Base64编码的字符串通常几乎没有空格,空格之间的字符串也会很长。

另外一种简单的方法是计算元音字母(a, e, i, o, u)和辅音字母的比例,或者看看单词中间有多少个大写字母。

7

你不能这样做,不能随便地去做。问题在于,普通的日常用词也可以是BASE64编码的内容。所以,实际上很难区分这两者。

BASE64编码没有其他的结束符,除了长度。它可以用=或==来结束,但并不一定非得用这些符号。=只是用来填充的。如果不需要填充,就不会有=。所以有可能BASE64编码结束后,接着就是一些文本,而你却无法察觉到。

关于“那我真的没有办法做到我想要的事情吗?”的补充:

不,不能可靠地做到。即使使用一些经验法则,也可能会出现失败的情况,导致你读取了太多字符,最后得到的二进制数据是垃圾,后面的文本流也会丢失一些字符。

现在说的是任意的BASE64块。如果你知道二进制数据是什么,那么或许还有希望。

举个例子,如果你知道二进制数据是什么,大多数二进制格式会“知道”什么时候结束。我不知道有哪个有效的二进制格式会说“读取直到到达文件结束”。它们通常会包含内部描述,告诉你“下一块数据有多少”或者用结束符表示“我结束了”。

在这些情况下,你可以把BASE64当作一个流来处理。BASE64其实很简单。它把3个字节转换成4个字符。

所以,一个B64流读取器只需要读取4个字符,然后返回它们代表的3个字节。

如果你有一个PNG读取器,它可以开始读取转换后的流。当它“完成”时,就“关闭”这个流,而你原来的文本就在BASE64的末尾。

如果你知道原始附件的大小,也可以这样做。如果有人发送了“10,000字节”,那么你就用你的BASE64流解码器,从中读取“10,000”字节。

通常情况下,你会有带=或==结束符的BASE64编码。没有这些符号的情况才会出现问题。流解码在这两种情况下都能正常工作。

如果你不知道原始附件的大小,或者编码的二进制格式,那么你基本上就没戏了。

撰写回答