关于php:base64解码/编码不一致

base64 decode/encode inconsistency

我试图对第三方项目使用的base64编码应用程序进行反向工程,因此我可以创建一个自定义UI。 我的方法在一个示例中取得了成功,但在其他示例中似乎并没有达到目标(一些字符不太正确)。

1
AQAAAAAAGQBec2lwOigwMjAxMjM0NTZbMC05XSspQC4qFwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQAA

^^数据库中的实际base64编码

1
AQAAAAAAEABec2lwOigwMjAxMjM0NTZbMC05XSspQC4qEwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQoA

^^与PHP方法匹配的最佳尝试

由于控制字符,我实现了一些json 编码,以便更轻松地识别用于变量的字符串。 字符串与该示例匹配,但是base64编码结果与预期的结果不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$actualfour = 'AQAAAAAAGQBec2lwOigwMjAxMjM0NTZbMC05XSspQC4qFwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQAA';
echo"".$actualfour;
echo"<br />";

    $four = chr(01);
    $four .= chr(00);
    $four .= chr(00);
    $four .= chr(00);
    $four .= chr(00);
    $four .= chr(00);
    $four .= chr(16);
    $four .= chr(00);
    $four .= '^sip:(020123456[0-9]+)@.*';
    $four .= chr(19);
    $four .= chr(00);
    $four .= 'sip:[email protected]
'
.chr(00);

$jsonfour = json_encode($four);
echo"unencoded:".$jsonfour;
echo"<br />";
$encodefour = base64_encode($four);
echo"".$encodefour;
echo"<br />";
$jsonencodefour = json_encode(base64_decode($encodefour));
echo"encoded:".$jsonencodefour;
echo"<br />";

if ($encodefour != $actualfour) { echo"FAIL"; } else { echo"PASS"; }

^^代码方法

1
2
3
4
5
6
7
AQAAAAAAGQBec2lwOigwMjAxMjM0NTZbMC05XSspQC4qFwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQAA
unencoded:"\u0001\u0000\u0000\u0000\u0000\u0000\u0010\u0000^sip:(020123456[0-9]+)@.*\u0013\u0000sip:[email protected]
\u0000"

AQAAAAAAEABec2lwOigwMjAxMjM0NTZbMC05XSspQC4qEwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQoA
encoded:  "\u0001\u0000\u0000\u0000\u0000\u0000\u0010\u0000^sip:(020123456[0-9]+)@.*\u0013\u0000sip:[email protected]
\u0000"

FAIL

^^输出


$four中有几个错误。

  • chr(16)应该是chr(0x19)chr(25)
  • chr(13)应该是chr(0x17)chr(23)
  • 127.0.0.1之后的换行符应为chr(00)

这是正确的$four

1
2
3
4
5
6
7
8
9
10
11
12
$four = chr(01);
$four .= chr(00);
$four .= chr(00);
$four .= chr(00);
$four .= chr(00);
$four .= chr(00);
$four .= chr(0x19);
$four .= chr(00);
$four .= '^sip:(020123456[0-9]+)@.*';
$four .= chr(0x17);
$four .= chr(00);
$four .= 'sip:[email protected]'.chr(00).chr(00);

通过将json_encode(base64_decode($actualfour))json_encode($four)进行比较,可以发现所有这些差异。 请记住,当它显示控制字符为\u####时,该数字为十六进制,而不是十进制。