PHPで「+」を文字列として認識させる方法(暗号化と復号)

実現したいこと

jsで暗号化した情報を、PHPで復号し情報の整合性を判断したいです。

前提

js側の暗号化・PHPの復号は、下記の記事を参考にさせていただき実装しています。
https://techblog.gracetory.co.jp/entry/2022/07/20/120000

js・PHPどちらのソースコードも見本をそのまま使用させていただいております。
※現状特に不具合や懸念点はありません。

暗号化した情報をURLのパラメータとして展開、PHP側で取得($_GET)し下記のプログラムで復号しています。

php

1function decrypt($cipher, $passphrase, $salt, $iv){2 $iterations = 100;3 $key = hash_pbkdf2("sha512", $passphrase, hex2bin($salt), $iterations, 128);4 $plain= openssl_decrypt(base64_decode($cipher), "AES-256-CBC", hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv));5 return $plain;6}

発生している問題・エラーメッセージ

問題点は以下の2点です

■暗号化された文字列に一定の確率で「+」が含まれる。(そもそもこれを避ける方法があればベスト)
■GETした「+」の含まれる文字列を関数などに渡すと「+」が「スペース」として認識されてしまう。

例えば、パラメータ「prm=sample+hogehoge」のような値が合った場合、
(上記decrypt関数において)「$cipher = $_GET['prm'];」として処理すると「sample hogehoge」として認識されるので復号の際に適切な値として判断されません。
ただ、「$cipher = 'sample+hogehoge';」のように直接文字列を入れれば正常に動くので、関数自体には問題があるわけではなく、
あくまでPHPで「+」を文字列として扱う方法が知りたいというのが質問の趣旨です。

試したこと

ChatGPTの指示でリプレイスやエンコードなども試してみましたが、いずれも上手くいきませんでした。

その他

大変恐縮ですが、パラメータに暗号含めるのどうなの?みたいなご指摘は一旦無しでお願いします…

何かアドバイスいただけますと幸いです。
よろしくお願いいたします。

コメントを投稿

0 コメント