当前位置: 首页 > 知识库问答 >
问题:

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

步衡
2023-03-14

我正在尝试解码服务器返回的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"

结果应该是(我在客观-c中使用通用密码器在Mac上得到的):

"Please input your username and password again"

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

共有1个答案

厍建义
2023-03-14

请看一下维基百科的文章。了解欧洲央行和加拿大广播公司如何进行解密。如果使用的模式是 ECB,则可以正确解密所有文本。似乎密码之所以使用CBC,是因为它使用以前的密文当前密文解密功能来获取原始文本。这就是您正确解码第二个块的原因。

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

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

 类似资料:
  • 我目前使用< code > AES/CBC/PKCS 5 Padding 对Java文件进行加密,密钥大小为256字节,但在搜索时,我在stack exchange PKCS # 5-PKCS # 7 Padding上发现了它, PKCS#5填充是8字节块大小的PKCS#7填充的子集 所以我想知道 > < li >对于上述配置,< code > AES/CBC/pkcs 7 padding 的性能

  • 我想使用NodeJS解密AES-256加密字符串。我正在使用密码模块。 我应该使用哪种算法? 下面是可供选择的算法列表:

  • 我想用圆心(x,y)和半径r画一个圆。

  • 我有一个元素,其中左上角和右下角的边框半径为5,我试图使它与CSS3Pie兼容。文件指出 只支持速记版本;longhand border-top-left-radius等属性不是。不过,速记语法支持每个角的半径不同。链接

  • 问题内容: 我有以下CSS: 添加边框半径:5px似乎没有任何作用,我认为这是因为我使用的是边框渐变,我是否有办法完全实现所需的5px边框半径? 问题答案: You cannot use with gradient. Here is another idea where you can rely on multiple background and adjust the : 如果需要透明性,可以考

  • 我已经研究这个问题几个星期了,但我仍然无法解决这个问题。 我有一个CardView,它包含一个带有ImageView的线性布局。 没有那个半径共享元素过渡可以无缝工作。但是,当我将半径(app: cardCornerRadius="25dp")添加到CardView时,共享元素过渡看起来很难看,因为它首先删除半径,然后开始动画。 第一种方法:ObjectAnimator 我创建ObjectAnim