base64解码/编码不一致

时间:2016-06-10 20:02:50

标签: php encoding base64 decoding

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

AQAAAAAAGQBec2lwOigwMjAxMjM0NTZbMC05XSspQC4qFwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQAA

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

AQAAAAAAEABec2lwOigwMjAxMjM0NTZbMC05XSspQC4qEwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQoA

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

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

$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:020122113@127.0.0.1
'.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"; }

^^代码方法

AQAAAAAAGQBec2lwOigwMjAxMjM0NTZbMC05XSspQC4qFwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQAA
unencoded: "\u0001\u0000\u0000\u0000\u0000\u0000\u0010\u0000^sip:(020123456[0-9]+)@.*\u0013\u0000sip:020122113@127.0.0.1\n\u0000"
AQAAAAAAEABec2lwOigwMjAxMjM0NTZbMC05XSspQC4qEwBzaXA6MDIwMTIyMTEzQDEyNy4wLjAuMQoA
encoded:   "\u0001\u0000\u0000\u0000\u0000\u0000\u0010\u0000^sip:(020123456[0-9]+)@.*\u0013\u0000sip:020122113@127.0.0.1\n\u0000"
FAIL

^^输出

1 个答案:

答案 0 :(得分:1)

$four中有几处错误。

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

这是正确的$four

$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:020122113@127.0.0.1'.chr(00).chr(00);

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