Since mcrypt is considered obsolete, my task is upgrading the current code to use openssl. Sounds simple, but ... after a few days of try and failure I feel like going insan
If you encrypt in mcrypt without adding PKCS7 manually, mcrypt will happily pad your plaintext with NUL
bytes.
OpenSSL will do PKCS7 padding for you whenever using aes-X-cbc
. The unfortunate consequence of this is that if you have AES-CBC(NULL_PADDED(plaintext))
and try to decrypt it, openssl_decrypt
will attempt to remove the padding and fail.
Compare http://3v4l.org/bdQe9 vs http://3v4l.org/jr68f and http://3v4l.org/K6ZEU
The OpenSSL extension does not currently offer you a way to say "This string is not padded, please don't strip the padding for me" and then remove the NUL
bytes on your own. You must encrypt with PKCS7 padding in order for decryption to succeed.
Although this is a limitation of OpenSSL, it bears emphasizing that the only reason you're running into it is because mcrypt is terrible.