- ベストアンサー
PHPでの文字操作について
- PHPで暗号化ロジック関数を作成する方法と、文字列を16進数状態に変換して戻す方法を考えています。
- 文字列を16進数に変換して暗号化することで、ビットに数字を足したり引いたりした値を文字列として保存できるのではないかと思っています。
- 現在文字列を16進数表記に変換する方法は分かっていますが、16進数から元の文字列に戻す方法が分かりません。エンディアンを考慮する必要があるようですが、具体的な方法は分かりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
bin2hex()は、文字列→数値ではなく、文字列→その1つずつの文字を16進数で書き直した「文字列」への変換ですので、ちょっと違うかと思います。 PHPでは、文字列中の各文字は $str{$idx} の形でアクセスできます。また、文字コードは ord( $char ) で取得でき、また数値から文字への変換は chr( $code ) で変換できます。 ということで、文字列はそのままに、各文字を取得し、ord()/chr()にて適時変換しながら書き換えでいかがでしょうか。 簡単な例を書くとこんな感じでしょうか。 // $buf :変換対象文字列 $length = strlen( $buf ); echo "変換前:" . $buf; for( $i = 0; $i < $length; ++$i ){ $buf{$i} = chr(0xff ^ ord( $buf{$i})); // 0xffとXOR } echo "変換後:" . $buf; for( $i = 0; $i < $length; ++$i ){ $buf{$i} = chr(0xff ^ ord( $buf{$i})); // 再度0xffとXOR } echo "復元後:" . $buf;
その他の回答 (1)
- satoh
- ベストアンサー率77% (17/22)
ごめんなさい、一時離れてたので、質問されていたのを見落としてました。 # もう見てないかな… > なぜ"Oxff"とXORを取っているのでしょうか? XORの部分が暗号化・復号っぽい処理ということで、特に他意はないです。 XOR(排他的論理和)は、同じ値で2回演算すると元の値に戻る性質があります。なので、0xFFという値に意味はありません。 1回目のXORで暗号化っぽい処理(文字が化ける)、2回目のXORで復号っぽい処理(文字が戻る)、ということです。 どのくらいの強度が必要かわかりませんが、世間で公開されている有名な暗号処理ルーチンを正しく使えば、普通は大丈夫でしょう。 自前の暗号処理を作ったとすると、暗号に関する数学的知識をちゃんと持って無いと、普通あっさりと破られます。 この辺りは、暗号に関する書籍などを当たって見てください。
お礼
ご回答ありがとうございます。 解かりやすくて納得しました。 排他的論理和を2回演算すると確かに戻りますね。 ちなみに暗号を自作しなければならない理由はレンタル サーバーでPHPの暗号化関数Mcrypt等が入ってない環境 での使用に対して、素人さんが解からない程度には データをカモフラージュできれば、という考えです。 なので暗号化強度は軽めでいいです。 ただ、satohさんの言う通り、このままではまだ暗号化 の強度が低いと思うので、この変換した暗号に更にもう 少し小細工はしてみたいと思っています。 解かりやすい意見ありがとうございました。
補足
とても参考になる解答有難うございます。 satohさんのサンプルでのソースでテスト してみたら良い感じに動きました。 ところでそのサンプルで質問なのですが、 ord関数で1文字づつのアスキーコードを取得 しchr関数で置換してるという事はなんとか 分かりましたが、なぜ"Oxff"とXORを取って いるのでしょうか? その辺が良く分からないので出来れば 教えてもらえないでしょうか? というかアスキーコード表の16進数を調べて みたのですが"0x7f"(DEL)とかは書いてあった のですが"Oxff"が何の文字なのか分からなかった のでその辺りの説明もできれば宜しくお願いします。