Base64解码,直到没有Base64

时间:2010-10-22 15:23:25

标签: python regex base64 decode encode

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

在这个简短的代码中,我可以对Base64进行解码,直到没有Base64,因为我的Text是定义的。 (直到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上。对不起我的英语不好。

4 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

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

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

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

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

如果您不知道附件的原始大小或编码二进制文件的格式,那么您将非常幸运。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

因此,您正在处理可能已重复进行base64编码的数据块?为什么不通过b64decode()循环字符串直到它出错,然后呢?

此外,我认为您可能不需要花费很多.encode("utf-8")左右。

答案 3 :(得分:0)

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