base64 decode/encode 不一致
base64 decode/encode inconsistency
我正在尝试对第三方项目使用的 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
^^ 输出
您在 $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####
时,数字是十六进制,而不是十进制。
我正在尝试对第三方项目使用的 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
^^ 输出
您在 $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####
时,数字是十六进制,而不是十进制。