我必须以PHP的AES CTS模式(窃取密文,有时称为AES-XTS)对数据进行加密和解密,以与用.NET平台编写的远程系统进行互操作。在.NET 4中,此模式为supported natively。
对于PHP,我找不到解决方案,根据手册,mcrypt似乎不支持此模式。
[谁能解释简单的CBC和CBC-CTS之间的区别吗?使用现有的模块/库是否可以使后者在PHP中工作?
这是维基百科article中插入我解释注释的评论中的步骤>
LDn =解密(K,Cn-1)。使用零作为IV解密倒数第二个密文块(倒数第二个128bit / 16字节大块)。
您可以使用标准的PHP mcrypt函数来执行此操作,只需通过
$ second_to_last_cipher = array_slice($ your_cipher_text_byte_array,count($ your_cipher_text_byte_array)-32,16)
到具有空Iv的mcrypt_decrypt
$ second_to_last_clear = mcrypt_decrypt“ MCRYPT_RIJNDAEL_128”,$ key,$ second_to_last_ciphe)
Cn = Cn ||尾巴(Dn,BM)。使用倒数第二个密文块的块密文解密的最后B-M位,将密文填充到块大小的最接近倍数。
将刚解密的值的最后n个字节复制到密文的最后一个块中。
$ n = 16-($ second_to_last_clear%16)
然后使用数组复制来复制数据
交换最后两个密文块。
只需切换交换,即可交换密文数组中倒数第二个和倒数第二个单元的内容
使用标准CBC模式解密密文,直到最后一块。
进行标准解密调用。
与最后一个密文进行最后一个密文的异或运算(在步骤1中已经解密)。
自我解释。
我在C语言中找到了AES算法的实现,可以通过源代码here找到它。
我已经使用标准的CBC接口在C和Python中实现了CBC密文窃取解密(密文窃取-CTS)。