2012-05-02 82 views
2

我必須在PHP中使用AES CTS模式(密文竊取,有時稱爲AES-XTS)對數據進行加密和解密,以便與使用.NET平臺編寫的遠程系統進行互操作。在.NET 4中,這種模式是supported natively如何在PHP中使用AES CBC + CTS(密文竊取)模式加密/解密數據?

對於PHP,我找不到解決方案,基於手冊,mcrypt似乎不支持此模式。

請問誰能解釋一下CBC和CBC-CTS的區別?是否有可能使用現有的模塊/庫使後者在PHP中工作?

回答

1

這是從維基百科article步驟插話與我的意見說明

  1. LDn的解密=(K,CN-1)。解密倒數第二個密文塊(倒數第二個128位/ 16字節塊),使用零作爲IV。

    您可以用標準的PHP的mcrypt功能做到這一點,只是通過

    $ second_to_last_cipher = array_slice($ your_cipher_text_byte_array,計數($ your_cipher_text_byte_array)-32,16)

    與空到mcrypt_decrypt㈣

    $ second_to_last_clear = mcrypt_decrypt 「MCRYPT_RIJNDAEL_128」,$鍵,$ second_to_last_ciphe)

  2. CN = ||道道尾巴(Dn,B-M)。使用倒數第二個密文塊的塊密碼解密的最後B-M個比特將密文填充到塊大小的最近倍數。

    將剛剛解密的值的最後n個字節複製到最後一個密文塊中。

    $ N = 16 - ($ second_to_last_clear%16)

    然後使用陣列複製複製數據

  3. 交換最後兩個密文塊。

    簡單地切換交換的最後和第二最後兩個單元格的內容在密文陣列

  4. 解密使用標準的CBC模式直到最後塊的密文。

    進行標準解密調用。

  5. 將最後一個密文(已經在步驟1中解密)與第二個最後的密文進行異或。

    自我解釋。

  6. 將明文截斷爲原始密文的長度。
1

我發現了C語言中AES算法的實現,可以通過源代碼here找到它。

作者的舊實現用於Android。所以我認爲實施將是非常有前途的。

最後,在您下載了源代碼之後,請檢查文件aesxam.c,這裏有一個很好的CTS CBC文件加密示例。

所有積分均爲Brian Gladman


Brian Gladman現在維護他自己的github repo for AES