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

问题描述 投票:2回答:3

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

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

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

php .net cryptography aes mcrypt
3个回答
1
投票

这是维基百科article中插入我解释注释的评论中的步骤>

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

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

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

    $ n = 16-($ second_to_last_clear%16)

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

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

  5. 只需切换交换,即可交换密文数组中倒数第二个和倒数第二个单元的内容

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

  7. 进行标准解密调用。

  8. 与最后一个密文进行最后一个密文的异或运算(在步骤1中已经解密)。

  9. 自我解释。

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

1
投票

我在C语言中找到了AES算法的实现,可以通过源代码here找到它。


0
投票

我已经使用标准的CBC接口在C和Python中实现了CBC密文窃取解密(密文窃取-CTS)。

© www.soinside.com 2019 - 2024. All rights reserved.