Base64编码的字符串搜索

时间:2008-12-07 04:43:21

标签: java search base64 encode

我有一个base64编码的字符串。如何搜索此字符串以检查此字符串是否包含未编码的特定子字符串?我不想解码该字符串然后搜索它。

我可以只编码特定的子字符串,并使用编码的子字符串搜索编码的字符串吗?

谢谢,

5 个答案:

答案 0 :(得分:8)

最好的方法可能是解码字符串。但是,如果确实有必要,可以动态执行此操作,而不是完全解码,然后搜索。您必须实现一次搜索,只解码您当前正在检查的部分。如果你有非常大的字符串,你真的不想(或不能)在内存中存储两次,那么这很有用。

如果您搜索的字符串足够长,您还可以使用不同的填充(例如'','x'和'xx')对该字符串进行三次编码,并搜索没有前4个和后4个字符的字符串(你不想匹配填充)。找到匹配项时,必须确保对齐方式与填充对应,并确认您尚未匹配的部分(由于填充)也已到位。当然,后者确实需要一些解码。

答案 1 :(得分:2)

假设你知道所涉及的base64编码的确切形式,你可以对你的字符串进行编码,好像它发生在三个偏移中的每一个上(开始%3 == 0,开始%3 == 1,开始%3 == 2 )。你必须在字符串的开头和结尾附近狡猾,因为这些字符会受到周围数据的影响。然后你可以使用普通的IndexOf或其他任何东西来检查字符串的中间部分,然后更聪明地检查开始和结束。

就个人而言,我不会解决所有这些问题 - 正如其他建议所推荐的那样,只需解码然后搜索。 很多更容易做对。

答案 2 :(得分:0)

Base64可以采用不同的算法或实现的几种不同的形式或含义。即使查看Wikipedia上的示例,也可以看到字符的编码值可能会根据位置而改变。简答:不,你不能只编码字符串并在较大的编码文本中搜索。

答案 3 :(得分:0)

正如其他人所指出的,对子字符串进行编码并直接使用它进行搜索可能具有挑战性。但是,从子字符串创建正则表达式可以使它更容易一些。

要演练一个示例,请考虑确定 Base64 编码数据是否对应于 Windows 可执行文件的用例。某些恶意软件包含 Base64 编码的 EXE,它将在受感染的系统上执行,在进行恶意软件分析以检测此情况时非常有用。 Windows 可执行文件可以通过在数据开头查找 MZ 并在其后某处查找 PE\x00\x00 来识别。

Base64 的工作原理是将字节流解释为 6 位值,默认情况下对应于字符 AZaz、{{ 1}} 到 09+。下图显示了这些映射:

Base64 Character Map

首先,首先将 \ 转换为其等效的二进制(在这种情况下,我们可以假设字符集是 ASCII,因此 MZM01001101 是 { {1}})。将这 16 位分成 6 位组产生:

Z

由于 16 不能被 6 整除,所以最后两位取决于 01011010 后面的数据。但是,由于只丢失了两位,因此该字符只有四个可能的值:

010011 010101 1010xx
T      V      ???

因此,要在 Base64 编码的文本块的开头查找 MZ,可以使用正则表达式 101000: o 101001: p 101010: q 101011: r

查找 MZ 更具挑战性,因为我们不知道它前面出现了多少个字符。根据 8 位组如何划分为 6 位组以形成 Base64 输出,需要考虑三种不同的情况:

  • 前零字节:前一个字节中的任何位都不会影响第一个字符 (^TV[o-r])
  • 前一个字节:前一个字节的两位影响第一个字符(PE\x00\x00;最后两位溢出)
  • 前两个字节:前一个字节的四位影响第一个字符(0 % 6 == 0;最后四位溢出)
  • 前三个字节:前一个字节中的任何位都不会影响第一个字符 (8 % 6 == 2)
  • ...等等

解决三种情况:

16 % 6 == 4

总之,您可以使用以下正则表达式来确定 Base64 编码的数据是否为 ​​Windows 可执行文件:

24 % 6 == 0

请注意,在有效的可执行文件中,DOS 标头和 PE 标头之间的空间可能受到限制,因此 Zero-bit shift: P E \x00 \x00 01010000 01000101 00000000 00000000 becomes: 010100 000100 010100 000000 000000 00xxxx U E U A A [A-P] Two-bit shift: ??? P E \x00 \x00 xxxxxxxx 01010000 01000101 00000000 00000000 becomes: xxxxxx xx0101 000001 010100 000000 000000 0000xx [FVl1] B F A A [A-D] Four-bit shift: ??? ??? P E \x00 \x00 xxxxxxxx xxxxxxxx 01010000 01000101 00000000 00000000 becomes: xxxxxx xxxxxx xxxx01 010000 010001 010000 000000 000000 [BFJNRVZdhlptx159] Q R Q A A 可以替换为较小的界限。

Base64 字符表来自:https://en.wikipedia.org/wiki/Base64#Base64_table

答案 4 :(得分:-1)

您不能只搜索已编码的子字符串。您的搜索字符串将根据其出现的原始字符串中的位置进行不同的编码。我想你需要解码整个字符串,然后搜索你的子字符串。