簡體   English   中英

PHP AES-128-CBC解密刪除XML標簽

[英]PHP AES-128-CBC decryption removing XML tags

我正在嘗試處理以加密數據形式接收的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”時,我得到了上面的警告。

正如我們在評論部分聊天時所發現的那樣,問題在於刪除了一些字節,這些字節被誤解為填充。 通過刪除這些字節,無法通過new SimpleXMLElement($data)解析結果字符串。

通過刪除與填充相關的代碼,僅通過mcrypt_decrypt進行簡單的解密,一切就可以了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM