base64编码数据与“随机”十六进制混合

时间:2009-11-19 00:33:37

标签: php base64 hex

我得到一个输入字符串,其中包含一些base64编码的数据。不幸的是,它将随机十六进制数据(全部小写)混合在一起。手动整理是相当简单的,因为十六进制数据似乎都是32字节的段。例如,我可以格式化一个像这样的示例字符串:

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    VGhpcyBpcyBzb

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226
    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    21lIGJhc2UtNjQ

    bb4af7e61760735ba17c29e8f542a668
    75da91e90863f1ddb7e149297fc59afc
    f5de951fb65d06d2927aab7b9b54830e
    2d935616a54c381c2f38db3731d5a378

    gZW5jb2RlZCB

    6dd11d15c419ac219901f14bdd999f38
    0ad94e978ad624d15189f5230e5435a9
    2dc19fe95e583e7d593dd52ae7e68a6e
    465ffa6074a371a8958dad3ad271181a
    23310939b981b4e56f2ecee26f82ec60
    fe04bef49be47603d1278cc80673b226

    kYXRhIGhvb3JheSE=

基本上,我需要输出base64东西并解码它(在PHP中)。问题是,我把它全部作为一个长字符串,而且并不总是立即显而易见的放置换行符。例如,base64内容的第一位以'b'结尾,很容易被误认为是某些十六进制数据。我对如何做到这一点感到有些失落...有什么想法吗?

谢谢!
-mala

3 个答案:

答案 0 :(得分:5)

我认为这是一个无法解决的问题 - 完全有可能拥有32个字节的base64编码数据,这些数据无法与32个字节的随机十六进制区分开来。如果没有关于流的更多信息,就不可能决定这样的数据可能会去哪个桶。

答案 1 :(得分:2)

你可以这样做:

read these 32 characters - if( preg_match(/[^a-f0-9]/) ) { 
echo "this is a hex string"; 
} else {
$base64[] = preg_replace('/[a-f0-9]$/', '');
}

当然,有一个尾随a-z / 0-9的问题,但这是一个起点。 您可以添加一些代码,其中从可疑base64的末尾开始计数到下一个[g-zA-Z]的开头,并查看该字符数是否可以被32整除。如果是,则可能找到所有你原来的base64。如果没有,如果'b'是b64的结尾或十六进制的开头,你将不知道,6是十六进制的结尾,或者你的NEXT b64的开头。

简而言之,这是愚蠢的,这让我感到难过。

答案 2 :(得分:0)

有可能base64解码到每个决策点(接下来的32个字节base64或hex)可能带有线索。

还有最简单的机会解释其中一个十六进制字符串,因为base64 始终会为正在解码的内容产生容易检测到的垃圾。

否则你运气不好。