2

我必须在 PHP 中以 AES CTS 模式(密文窃取,有时称为 AES-XTS)加密和解密数据,才能与用 .NET 平台编写的远程系统进行互操作。在 .NET 4 中,本机支持此模式。

对于PHP,我找不到解决方案,根据手册,mcrypt似乎不支持这种模式。

谁能解释普通CBC和CBC-CTS之间的区别?是否可以使用现有的模块/库使后者在 PHP 中工作?

4

2 回答 2

1

这是维基百科文章中的步骤,其中插入了我的评论,解释了

  1. 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)

  2. Cn = Cn || 尾巴(Dn,BM)。使用倒数第二个密文块的块密码解密的最后 B-M 位将密文填充到块大小的最接近的倍数。

    将刚刚解密的值的最后 n 个字节复制到最后一个密文块中。

    $n = 16 - ($second_to_last_clear % 16)

    然后使用数组复制复制数据

  3. 交换最后两个密文块。

    只需交换密文数组中最后一个和第二个最后两个单元格的内容

  4. 使用标准 CBC 模式解密密文直到最后一个块。

    进行标准解密调用。

  5. 最后一个密文(已在步骤 1 中解密)与倒数第二个密文异或。

    不言自明。

  6. 将明文截断为原始密文的长度。
于 2012-05-02T22:09:52.063 回答
1

我在 C 中找到了 AES 算法的实现,你可以在这里找到它的源代码。

作者的旧实现是在Android中使用的。所以我认为实施将非常有希望。

最后,在你下载了源代码之后,再检查一下文件aesxam.c,有一个非常好的 CTS 示例,它使用 CBC 进行文件加密。

所有的功劳都归于布赖恩·格拉德曼


Brian Gladman 现在为 AES维护自己的 github 存储库。

于 2014-06-11T10:55:04.373 回答