如何使openssl_encrypt填充所需块大小的输入?

时间:2017-02-13 19:14:48

标签: php encryption padding php-openssl php-7.1

如果我手动将字符串填充到32的长度,我的代码就可以工作 我的问题是:有没有办法让openSSL填充数据,还是我总是必须为它做?

工作:

 openssl_encrypt ("my baba is over the ocean1111111", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV);

不工作:

openssl_encrypt ("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$MY_IV);

我现在通过自填充来解决这个问题:

$pad = 32 - (strlen("my baba is over the ocean") % 32);
$clear = "my baba is over the ocean" . str_repeat(chr($pad), $pad); //encrypt this string

1 个答案:

答案 0 :(得分:7)

正如Luke Park所说,不是明确地告诉openssl_encrypt使用OPENSSL_ZERO_PADDING,而只是从参数中删除该选项,它将默认为PKCS #7 padding scheme(填充块的其余部分)使用0x0n,其中 n 是必需的字节数;如果块已经完成,则为+ 16 0x00注意:Luke和PKCS#7引用的PKCS#5在这种情况下实际上是相同的。

来自PHP docs

  

不使用OPENSSL_ZERO_PADDING,您将自动获得PKCS#7填充。

所以你应该打电话:

openssl_encrypt("my baba is over the ocean", 'AES-256-CBC', $MY_SECRET_KEY, OPENSSL_RAW_DATA, $MY_IV);