<klugscheissermodus> ;-) Ja, so ähnlich mache ich es auch. Aber kleiner Tip, mit str_pad(..,32,"0",STR_PAD_RIGHT) kannst Du Dir die eine Schleife sparen und substr braucht den strlen als dritten Parameter nicht für den String nach dem 16ten Zeichen.
Die openssl_random_pseudo_bytes Länger kann man natürlich auch hart kodiert angeben, aber etwas besser lesbar ist es evtl. mit openssl_cipher_iv_length('AES-256-CBC').
Wie ich bei Dir sehe hast du das Padding und Unpadding von den Beispielen nicht mit eingebaut..?
</klugscheiserfragenmodus>