我必须在 PHP 中以 AES CTS 模式(密文窃取,有时称为 AES-XTS)加密和解密数据,才能与用 .NET 平台编写的远程系统进行互操作。在 .NET 4 中,本机支持此模式。
对于PHP,我找不到解决方案,根据手册,mcrypt似乎不支持这种模式。
谁能解释普通CBC和CBC-CTS之间的区别?是否可以使用现有的模块/库使后者在 PHP 中工作?
这是维基百科文章中的步骤,其中插入了我的评论,解释了
LDn = 解密 (K, Cn-1)。使用零作为 IV 解密倒数第二个密文块(倒数第二个 128 位/16 字节块块)。
您可以使用标准的 PHP mcrypt 函数执行此操作,只需通过
$second_to_last_cipher=array_slice($your_cipher_text_byte_array,count($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,BM)。使用倒数第二个密文块的块密码解密的最后 B-M 位将密文填充到块大小的最接近的倍数。
将刚刚解密的值的最后 n 个字节复制到最后一个密文块中。
$n = 16 - ($second_to_last_clear % 16)
然后使用数组复制复制数据
交换最后两个密文块。
只需交换密文数组中最后一个和第二个最后两个单元格的内容
使用标准 CBC 模式解密密文直到最后一个块。
进行标准解密调用。
最后一个密文(已在步骤 1 中解密)与倒数第二个密文异或。
不言自明。
我在 C 中找到了 AES 算法的实现,你可以在这里找到它的源代码。
作者的旧实现是在Android中使用的。所以我认为实施将非常有希望。
最后,在你下载了源代码之后,再检查一下文件aesxam.c
,有一个非常好的 CTS 示例,它使用 CBC 进行文件加密。
所有的功劳都归于布赖恩·格拉德曼。
Brian Gladman 现在为 AES维护自己的 github 存储库。