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

Ita*_*vka 3 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);
Run Code Online (Sandbox Code Playgroud)

不工作:

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

我目前通过自填充来解决这个问题:

$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
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 7

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

来自PHP文档:

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

所以你应该打电话给:

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

  • 令我困惑的是Name,我认为这意味着填充ZERO.事实上,这意味着没有PADDING. (3认同)