PHP AES-128-CBC解密删除XML标签

时间:2018-06-20 09:41:36

标签: php xml aes

我正在尝试处理以加密数据形式接收的API XML响应。我用这个功能解密它

function aes128_cbc_decrypt($key, $data, $iv) {
   $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
   $padding = ord($data[strlen($data) - 1]);
   return substr($data, 0, -$padding);
}

结果是:

888 123671891 123 2018-12-11 123671892 1234 2018-12-11

但是结果应该是这样

<Codes>
  <ServiceProviderId>888</ServiceProviderId>
  <Voucher>
    <PIN>123671891</PIN>
    <Serial>123</Serial>
    <Validity>2018-12-31</Validity>
  </Voucher>
  <Voucher>
    <PIN>123671892</PIN>
    <Serial>1234</Serial>
    <Validity>2018-01-23</Validity>
  </Voucher>
</Codes>

我试图将其转换为xml:

$oXML = new SimpleXMLElement($data);//data is the plain text before the tags

但是我得到了

Warning: SimpleXMLElement::__construct(): Entity: line 13: parser error : expected '>' 

Warning: SimpleXMLElement::__construct(): Entity: line 13: parser error : Opening and ending tag mismatch: Code line 1 and M 

Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' 
Stack trace: #0 : SimpleXMLElement->__construct('<Codes...') #1 {main} 

那么如何像上面提到的示例一样,编辑该函数以浏览标签,甚至转换为以空格分隔的纯文本数据到xml标签?

[更新]

服务提供商使用此命令行解密和提取XML代码

openssl enc -d -aes-128-cbc -K 2c6a3537532e2d55336f40562e3f3728 -iv 00000000000000000000000000000000 -nopad -in vouchers.aes -out vouchers.xml

我收到此警告

Warning: mcrypt_decrypt(): The IV parameter must be as long as the blocksize

会是个问题吗?

[Update2]

新的加密数据

ï—®B}Õ]µåú‚2    |mE!ˆNÃìUí7“WãóZÍ? mn­Â`׃«âQÅö÷õuh8ïBÈÏõ:SÔ+Ä«¬Y¦¯9U¦Ó AûûÒœïŽ tsx Ñèµ4ÍC„÷ËÄùy¼Mú‹ø‘Ú‘Êÿ*‘䜣燌?5͹¯B¾éó|•VÖ¨-pÃñ6p‚Ï>Ü­1Ž%Ò‰WœÌ~¶Î¬í#¸)i²ºøq+ÊÏ'šþ!_5ˆ¨I®ßØSe°„¶Þp~´~ÀLíQ@ wbN6'è‘Ô5Ë”õI©Üp¨b¦ùãmÁ~C•Wí>äúÕA@ƒjãDÎÐË]Çt<-Ù³{!ú®SÅÄ#…"üJíûEÒœJ·¶žÒ\y@I»€5ˆ§p=”%åÔa›%Ïgͤâ2u[>µ½–ƒRÈ

结果应该是

<Codes>
  <ServiceProviderId>666</ServiceProviderId>
  <Voucher>
    <PIN>123456789000001</PIN>
    <Serial>1234567890001</Serial>
    <Validity>2013-12-11</Validity>
  </Voucher>
  <Voucher>
    <PIN>123456789000002</PIN>
    <Serial>1234567890002</Serial>
    <Validity>2013-12-11</Validity>
 </Voucher>
</Codes>

但是当我回显解密函数时,我得到:

666 123456789000001 1234567890001 2013-12-11 123456789000002 1234567890002 2013-12-11

当我尝试使用“ SimpleXMLElement”时,我得到上面的警告。

1 个答案:

答案 0 :(得分:1)

正如我们在注释部分聊天时所发现的那样,问题在于删除了一些字节,这些字节被误解为填充。通过删除这些字节,无法通过new SimpleXMLElement($data)

解析结果字符串

通过删除与填充相关的代码,仅通过mcrypt_decrypt进行简单的解密,一切就可以了