如何在PHP中使用AES CBC + CTS(密文窃取)模式加密/解密数据?

时间:2012-05-02 09:28:33

标签: php .net cryptography aes mcrypt

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

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

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

2 个答案:

答案 0 :(得分:1)

这是维基百科article插入我的评论解释

的步骤
  1. 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)

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

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

    $ n = 16 - ($ second_to_last_clear%16)

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

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

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

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

    进行标准解密通话。

  5. 使用第二个最后一个密文对最后一个密文(已在步骤1中解密)进行异或运算。

    自我解释。

  6. 将明文截断为原始密文的长度。

答案 1 :(得分:1)

我在C中找到了AES算法的实现,您可以使用源代码here找到它。

Android中使用了作者较早的实现。所以我认为实施非常有希望。

最后,在您下载源代码后,检查文件aesxam.c,有一个非常好的CTS CBC文件加密示例。

所有积分均转至Brian Gladman


Brian Gladman现在维护自己的github repo for AES