【问题标题】:Base64 decode until there is no Base64Base64解码直到没有Base64
【发布时间】:2010-10-22 15:23:24
【问题描述】:

所以我的问题很简单,我想。我需要解码 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。 S. 抱歉我的英语不好。

【问题讨论】:

  • 你的意思是你不一定知道base 64数据在哪里结束,对吧? “Du meinst, dass man nicht unbedingt wissen, wo die Basis 64 Daten enden, nicht wahr? Es tut mir leid für mein schlechtes Deutsch。”
  • 如果这是您的问题,我会感到困惑,因为 base64 数据有一个停止字符“=”。请参阅:en.wikipedia.org/wiki/Base64“Ist das Ihre Frage, finde ich es verwirrend, weil base64 Daten hat ein Stoppzeichen, '='。”

标签: python regex base64 decode encode


【解决方案1】:

你不能,不是在任意意义上。问题很简单,正常的,每天的单词也可以是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)与辅音的比例或单词中间大写字母的数量。

【讨论】:

    【解决方案3】:

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

    另外我认为你可能不需要在周围撒那么多.encode("utf-8")

    【讨论】:

    • 我认为他的意思是他不一定知道base64数据在哪里结束,并不是说数据已经被编码了不确定的次数。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2015-07-14
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多