具有 PKCS7 填充编码数据的 AES 256 具有一半 ECB 和一半 CBC 块
Posted
技术标签:
【中文标题】具有 PKCS7 填充编码数据的 AES 256 具有一半 ECB 和一半 CBC 块【英文标题】:AES 256 with PKCS7 padding encoded data have half ECB and half CBC block 【发布时间】:2015-08-22 02:16:05 【问题描述】:我正在尝试解码从服务器返回的 php 中的数据:我知道数据 AES 256 已解码并有 PKCS7 填充,但无法弄清楚它使用哪种块模式
这是我的 php 函数:
public function decode($data)
//AES decode
$iv = mcrypt_create_iv(GEServerConnection::FBENCRYPT_BLOCK_SIZE, MCRYPT_RAND);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->cryptKey, base64_decode($data), MCRYPT_MODE_ECB, $iv);
//return $data;
$len = strlen($data);
$pad = ord($data[$len - 1]);
return substr($data, 0, - $pad);
编码数据示例
3KD+zb/2u5gGEWvOy0Q0nSQE9pbQZmg27iN6WLiO/Af9YjN8MhHOb8TMa5uETaab
当我使用 ECB (MCRYPT_MODE_ECB) 解码时,它只解码数据的开头,其余部分不可读
"Please input yo��̓��g|��*P�Te��� R�B
当使用 CBC (MCRYPT_MODE_CBC) 模式解码时,它开始无法读取
��0�=v������.3ur username and password again"
结果应该是(我在 mac 上使用 Objective-c 中的 CommonCryptor 得到的结果):
"Please input your username and password again"
有人知道出了什么问题或如何以正确的方式对其进行解码吗?
【问题讨论】:
【参考方案1】:请查看Wikipedia article。了解 ECB 和 CBC 如何进行解密。如果使用 ECB 模式,您将正确解密所有文本。密码似乎使用了CBC,因为它使用以前的密文+当前密文+解密函数来获取原始文本。这就是您正确解码第二个块的原因。
现在为什么第一个块解码错误?这是因为您需要提供正确的初始化向量。它必须与用于加密的相同。我们很幸运,我们知道 ECB 解码了第一个块,因为 ECB 不使用初始化向量。
答案很简单:使用带有零初始化向量(所有字节都为零)的 CBC,因为现在您的随机 IV 将第一个块更改为错误的输出。
【讨论】:
谢谢!我开始考虑它,但 mcrypt 没有零向量创建功能,我自己做了:$iv = str_repeat("\0", 16);以上是关于具有 PKCS7 填充编码数据的 AES 256 具有一半 ECB 和一半 CBC 块的主要内容,如果未能解决你的问题,请参考以下文章
AES/CBC/PKCS5Padding 与 AES/CBC/PKCS7Padding 与 256 密钥大小性能 java