6

如果我手动将字符串填充到 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
4

1 回答 1

9

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

来自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);
于 2017-02-14T07:33:13.587 回答