具有PKCS7填充编码数据的AES 256具有一半ECB和一半CBC块

时间:2015-06-07 15:16:32

标签: php objective-c aes mcrypt commoncrypto

我试图解码从服务器返回的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"

结果应该是(在Objective-c中使用CommonCryptor获得的mac):

"Please input your username and password again"

有人知道什么是错的或者如何以正确的方式解码它?

1 个答案:

答案 0 :(得分:6)

请查看Wikipedia article。了解ECB和CBC如何解密。如果ECB是使用的模式,您将正确解密所有文本。似乎密码使用CBC,因为它使用先前的密文+当前密文+解密函数来获取原始文本。这就是您正确解码第二个块的原因。

现在为什么第一个块解码错了?这是因为你需要提供正确的初始化向量。它必须与用于加密的相同。我们很幸运,我们知道ECB解码了第一个块,因为ECB不使用初始化向量。

答案很简单:使用初始向量为零的CBC(所有字节均为零),因为现在随机IV将第一个块更改为错误输出。