我必须在PHP中以AES CTS模式(密文窃取,有时称为AES-XTS)加密和解密数据,以便与用.NET平台编写的远程系统进行互操作。在.NET 4中,此模式为supported natively。
对于PHP,我找不到解决方案,根据手册,mcrypt似乎不支持这种模式。
有人可以解释普通CBC和CBC-CTS之间的区别吗?是否可以使用现有的模块/库使后者在PHP中工作?
答案 0 :(得分:1)
这是维基百科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)
使用null Iv的mcrypt_decrypt
$ second_to_last_clear = mcrypt_decrypt“MCRYPT_RIJNDAEL_128”,$ key,$ second_to_last_ciphe)
Cn = Cn ||尾巴(Dn,B-M)。使用倒数第二个密文块的块密码解密的最后B-M位将密文填充到块大小的最接近的倍数。
将刚刚解密的值的最后n个字节复制到最后一个密文块中。
$ n = 16 - ($ second_to_last_clear%16)
然后使用数组副本复制数据
交换最后两个密文块。
只需切换交换密文数组中最后两个最后一个单元格的内容
使用标准CBC模式解密密文直到最后一个块。
进行标准解密通话。
使用第二个最后一个密文对最后一个密文(已在步骤1中解密)进行异或运算。
自我解释。
答案 1 :(得分:1)
我在C中找到了AES算法的实现,您可以使用源代码here找到它。
Android中使用了作者较早的实现。所以我认为实施非常有希望。
最后,在您下载源代码后,检查文件aesxam.c
,有一个非常好的CTS CBC文件加密示例。
所有积分均转至Brian Gladman。
Brian Gladman现在维护自己的github repo for AES。