2017-02-13 87 views
2

我的代码如果我手动填充我的字符串长度为32的作品。
我的问题是:有没有办法让openSSL填充数据,或者我总是必须为它做?如何使openssl_encrypt将输入填充到所需的块大小?

工作:

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

为AES所需的块大小是16。我猜你的0填充的选择是混淆的机制。 – jww

+1

你可不是故意使用PKCS5作为你的填充方案来代替你现在有零填充的地方吗? –

+0

@LukePark有没有内置的方法来做到这一点?顺便说一句 - >注意我自己垫块,而不是零 –

回答

2

由于卢克,帕克说,而不是明确地告诉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); 
+2

什么使我困惑的是名称,我认为它意味着填充ZERO。而事实上它的意思是没有填充。 –