我必須在PHP中使用AES CTS模式(密文竊取,有時稱爲AES-XTS)對數據進行加密和解密,以便與使用.NET平臺編寫的遠程系統進行互操作。在.NET 4中,這種模式是supported natively。如何在PHP中使用AES CBC + CTS(密文竊取)模式加密/解密數據?
對於PHP,我找不到解決方案,基於手冊,mcrypt似乎不支持此模式。
請問誰能解釋一下CBC和CBC-CTS的區別?是否有可能使用現有的模塊/庫使後者在PHP中工作?
我必須在PHP中使用AES CTS模式(密文竊取,有時稱爲AES-XTS)對數據進行加密和解密,以便與使用.NET平臺編寫的遠程系統進行互操作。在.NET 4中,這種模式是supported natively。如何在PHP中使用AES CBC + CTS(密文竊取)模式加密/解密數據?
對於PHP,我找不到解決方案,基於手冊,mcrypt似乎不支持此模式。
請問誰能解釋一下CBC和CBC-CTS的區別?是否有可能使用現有的模塊/庫使後者在PHP中工作?
這是從維基百科article步驟插話與我的意見說明
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)
CN = ||道道尾巴(Dn,B-M)。使用倒數第二個密文塊的塊密碼解密的最後B-M個比特將密文填充到塊大小的最近倍數。
將剛剛解密的值的最後n個字節複製到最後一個密文塊中。
$ N = 16 - ($ second_to_last_clear%16)
然後使用陣列複製複製數據
交換最後兩個密文塊。
簡單地切換交換的最後和第二最後兩個單元格的內容在密文陣列
解密使用標準的CBC模式直到最後塊的密文。
進行標準解密調用。
將最後一個密文(已經在步驟1中解密)與第二個最後的密文進行異或。
自我解釋。
我發現了C語言中AES算法的實現,可以通過源代碼here找到它。
作者的舊實現用於Android。所以我認爲實施將是非常有前途的。
最後,在您下載了源代碼之後,請檢查文件aesxam.c
,這裏有一個很好的CTS CBC文件加密示例。
所有積分均爲Brian Gladman。
Brian Gladman現在維護他自己的github repo for AES。