Base64解码,直到没有Base64

问题描述 投票:1回答:4

所以我认为我的问题非常简单。我需要解码Base64,直到没有Base64,如果有一些Base64,我用RegEx检查,但我不知道如何解码,直到没有Base64。

在这个简短的代码中我可以解码Base64,直到没有Base64,因为我的文本是定义的。 (直到Base64 Decode Stuff不是“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)

P. S.抱歉我的英语不好。

python regex base64 decode encode
4个回答
6
投票

你不能,不能在任意意义上。问题很简单就是正常,每天的单词也可以是BASE64。所以,没有真正的方法来区分两者之间的区别。

BASE64没有长度以外的终结符。它可以用=或==终止,但不能终止。 =只是填充。不需要填充,然后没有=。因此BASE64可能会结束并且一些文本将开始,而您无法检测到它。

编辑“所以我真的没办法做我想要的事情吗?”:

不,不是确定性的,不可靠的。即使使用启发式方法,也有可能出现失败的情况,最终会消耗太多字符,导致二进制块结尾处出现垃圾,以及后续文本流中的字符丢失。

现在这是一个任意的BASE64块。如果你知道二进制数据是什么,那么也许是希望。

例如,如果你知道二进制数据是什么,大多数二进制格式“知​​道”何时“完成”。我不知道有效的二进制格式是“读到EOF”。它们通常包含内部描述符“这是下一个块有多少数据”或终结者说“我已经完成”。

在这些情况下,您可以将BASE64视为流。 BASE64基本上非常简单。它需要3个字节并将它们转换为4个字符。

因此,B64流读取器需要简单地读取4个字符并返回它们代表的3个字节。

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

如果您知道原始附件的大小,它也可以工作。如果有人发送“10,000字节”,那么您使用BASE64流解码器并从中读取“10,000”字节。

通常情况下,您将使用带有=或==终止符的BASE64。在这种情况下,你不会这是一个问题。解码的流以任何一种方式工作。

如果你不知道附件的原始大小,或编码二进制文件的格式,那么你几乎没有运气。


2
投票

作为启发式,您可以计算结果中的平均字长。自然语言会有短语,例如“作为启发式,你可以看一下单词长度。”仍然是Base64编码的字符串将在空格之间具有很少的空格和长字符串。

作为另一种启发式方法,您可以计算元音(a,e,i,o,u)与辅音的比例或单词中间的大写字母数。


0
投票

那么你正在处理可能已经反复进行base64编码的数据块?为什么不通过b64decode()循环字符串直到它出错呢?

此外,我认为你可能不需要洒这么多的.encode("utf-8")


0
投票

我在这里看到两个有价值的答案,指的是平均字长(Mark Lutton)和原始数据的字节大小(Will Hartung)。另一个有用的东西:寻找预期的词典单词,有意义的数字或/和日期。

© www.soinside.com 2019 - 2024. All rights reserved.