PHPでの文字操作について

このQ&Aのポイント
  • PHPで暗号化ロジック関数を作成する方法と、文字列を16進数状態に変換して戻す方法を考えています。
  • 文字列を16進数に変換して暗号化することで、ビットに数字を足したり引いたりした値を文字列として保存できるのではないかと思っています。
  • 現在文字列を16進数表記に変換する方法は分かっていますが、16進数から元の文字列に戻す方法が分かりません。エンディアンを考慮する必要があるようですが、具体的な方法は分かりません。
回答を見る
  • ベストアンサー

PHPでの文字操作について

簡単にいうとPHPで暗号化ロジック関数を作成しようと考えています。 ※この暗号化は復号出来る事を前提に考えています。 簡単なレベルで元の文字列をまず16進数状態に変換して戻す という事が出来ないか?と考えています。 これが出来ればビットに数字を足したり引いたりした値を暗号化 文字列としてできるのではないかと思っています。 一応現在文字列の16進数表記は以下の手順で出来るという事が 分かったのですが、16進数表記にしたデータを元の文字列に 戻す方法が分かりません。 何か良い方法が在れば宜しくお願いします。 少し調べたら16進数から文字列に戻すにはエンディアンを考慮~ という説明があるのですが、私にはハッキリと分からない状態です。 【16進数化テスト】 <?php ### 元データの設定 $data01 = "テストデータ"; ### 16進数表記化 $data02 = bin2hex($data01); ### 暗号化情報の表記 echo "暗号前:" . $data01; echo "暗号後:" . $data02; ?>

  • PHP
  • 回答数2
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • satoh
  • ベストアンサー率77% (17/22)
回答No.1

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;

orenge_mint
質問者

補足

とても参考になる解答有難うございます。 satohさんのサンプルでのソースでテスト してみたら良い感じに動きました。 ところでそのサンプルで質問なのですが、 ord関数で1文字づつのアスキーコードを取得 しchr関数で置換してるという事はなんとか 分かりましたが、なぜ"Oxff"とXORを取って いるのでしょうか? その辺が良く分からないので出来れば 教えてもらえないでしょうか? というかアスキーコード表の16進数を調べて みたのですが"0x7f"(DEL)とかは書いてあった のですが"Oxff"が何の文字なのか分からなかった のでその辺りの説明もできれば宜しくお願いします。

その他の回答 (1)

  • satoh
  • ベストアンサー率77% (17/22)
回答No.2

ごめんなさい、一時離れてたので、質問されていたのを見落としてました。 # もう見てないかな… > なぜ"Oxff"とXORを取っているのでしょうか? XORの部分が暗号化・復号っぽい処理ということで、特に他意はないです。 XOR(排他的論理和)は、同じ値で2回演算すると元の値に戻る性質があります。なので、0xFFという値に意味はありません。 1回目のXORで暗号化っぽい処理(文字が化ける)、2回目のXORで復号っぽい処理(文字が戻る)、ということです。 どのくらいの強度が必要かわかりませんが、世間で公開されている有名な暗号処理ルーチンを正しく使えば、普通は大丈夫でしょう。 自前の暗号処理を作ったとすると、暗号に関する数学的知識をちゃんと持って無いと、普通あっさりと破られます。 この辺りは、暗号に関する書籍などを当たって見てください。

orenge_mint
質問者

お礼

ご回答ありがとうございます。 解かりやすくて納得しました。 排他的論理和を2回演算すると確かに戻りますね。 ちなみに暗号を自作しなければならない理由はレンタル サーバーでPHPの暗号化関数Mcrypt等が入ってない環境 での使用に対して、素人さんが解からない程度には データをカモフラージュできれば、という考えです。 なので暗号化強度は軽めでいいです。 ただ、satohさんの言う通り、このままではまだ暗号化 の強度が低いと思うので、この変換した暗号に更にもう 少し小細工はしてみたいと思っています。 解かりやすい意見ありがとうございました。

関連するQ&A

  • PHP パラメータの暗号 復号

    PHPのパラメータを暗号化して 取得側で復号処理も行いたいのですが・・・。 いろいろなサイトをみて試していますが、暗号化された文字列に、 おそらく+(プラス)が入ると復号がうまく行きませんでした。 みなさんはどのようにされていますでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 文字コード結果が違うのはなぜでしょうか?

    文字コード結果が違うのはなぜでしょうか? いつも参考にさせていただいております。ありがとうございます。 VBAにて、文字コード(16進表記)を取得したいのですが、 1.hex(ascw("あ")) 2.Dim ByteData() As Byte  ByteData = "あ" Debug.Print Hex(ByteData(0)) & Hex(ByteData(1)) の2通り行っているのですが、結果が違いました。 1.3042 2.4230 となってしまいます。 UNICODEのリトルエンディアン・ビックエンディアンの違いなのかとも思いましたが、 上記はどちらもVBAで行っているため、式によって扱いが違うとも考えられません。 この違いはなぜなのでしょうか? ご教授よろしくお願いいたします。

  • テストの上手な書き方

    暗号化、複合化するプログラムを作っています。 クラスには暗号化メソッドと復号化メソッドを作る予定です。 あるデータを暗号化して復号化したら元のデータに戻っていることをテストしたいです。 単体テストはどのように書くのがいいのでしょうか? 復号化メソッドのテストの中で暗号化メソッドを使ってしまうと、どちらのメソッドのテストだかわからなくなってしまうし、復号化メソッドの中でテストデータとして暗号文を使うには、暗号化メソッドを先に実装して暗号文を計算させなくてはいけなくなってしまいます。。

  • 文字列の暗号化と復号化

    .NETで文字列を固定長に暗号化したい。(ユニコード対応できる) また、暗号化したものを復号化します。 .NETに付いている暗号化のモジュールはいくつがありますが、その以外のやり方がありましょうか? 例:何桁の平文を暗号化しでも8桁の十六進数又はBASE64の秘文になる。

  • 文字列分割方法

    フォームから入力されたデーターを文字数により4分割したい場合、 シングルバイトとマルチバイト文字列が混在していると、文字化けが起こってしまいます。 私が考えた方法は <?php $test="あああああいいいいいうううううえええええ"; $length = strlen($test); $length2 = (int)$length/4 $quarter[] = substr($test,0,$length2); $quarter[] = substr($test,$length2,$length2); $quarter[] = substr($test,$length2*2,$length2); $quarter[] = substr($test,$length2*3,$length2); echo $quarter[0]."<BR><BR>"; echo $quarter[1]."<BR><BR>"; echo $quarter[2]."<BR><BR>"; echo $quarter[3]."<BR><BR>"; ?> というものだったんですが、この場合$testに半角文字のaなどが入ると 文字化けしてしまいます。 上手く、マルチバイト・シングルバイト複合文字列を文字数により4分割する方法はないでしょうか? ご教授ください

    • ベストアンサー
    • PHP
  • phpのコードで暗号化された文字列を得る方法

    WordPressの無料で配布されているテンプレートの footer.phpにはこのようなコードが書かれています。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ <? eval(gzinflate(base64_decode('暗号化された文字列'))); ?> _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 文字列には英数字が沢山並んでいますが、これを暗号化される前の状態にしたいです。 どうすれば良いでしょうかご教示お願いします。

    • 締切済み
    • PHP
  • php_screwでフォルダ毎の暗号化はできますか

    現在、以下のように設定し失敗しています。 暗号化は以下のように行っています。 /usr/php_screw/php_screw_1/tools/screw_1 /var/www/html/test1/test1.php /usr/php_screw/php_screw_2/tools/screw_2 /var/www/html/test2/test2.php 復号化は以下のようにリネームしたphp_screw.soをphp.iniに複数指定しています。 extension="php_screw_1.so" extension="php_screw_2.so" この場合、暗号化と復号化の紐付けが出来ていない為?失敗しています。 上記の方法の改善策、又は別の方法があれば教えてください。 お願いいたします。

    • 締切済み
    • PHP
  • PHPで文字列の比較しています

    PHPで文字列の比較しています 同一の値をエラーをかけたいのですが、 うまくいきません。 echoで出力していて可視は同じ値なのですが。 以下コードになります。 (実際はPHPExcelでExcelの値を配列にいれ電話番号の-抜いてます) $data[1][4]="03-0000-0000" $data[1][4]=str_replace("-","",$data[1][4]); $data[1][5]="03-0000-0000" $data[1][5]=str_replace("-","",$data[1][5]); if($data[1][5] == $data[$cols][4]) { echo "入力エラー:"; echo "同一電話番号が存在します。"; exit; }

    • ベストアンサー
    • PHP
  • PHPで文字列の比較しています

    PHPで文字列の比較しています 同一の値をエラーをかけたいのですが、 うまくいきません。 echoで出力していて可視は同じ値なのですが。 以下コードになります。 (実際はPHPExcelでExcelの値を配列にいれ電話番号の-抜いてます) $data[1][4]="03-0000-0000" $data[1][4]=str_replace("-","",$data[1][4]); $data[1][5]="03-0000-0000" $data[1][5]=str_replace("-","",$data[1][5]); if($data[1][5] == $data[1][4]) { echo "入力エラー:"; echo "同一電話番号が存在します。"; exit; }

    • ベストアンサー
    • PHP
  • VBAで文字列を圧縮、復号したい

    以下のサイトと同じことをVBAで実現できないでしょうか? JavaScriptで文字列を圧縮する https://setchi.hatenablog.com/entry/2013/11/09/114432 元の文字列:エクセル 圧縮された文字列:U3U1VrUwUnW0UIUy3KAMJycww1jV0QkA 復号された文字列:エクセル データの復号をすることになり、エクセルで処理を行いたいと思ってます、データは圧縮された文字列Base64のようで、サイトなどで調べVBAでBase64の復号を試しましたが正しく文字列にならず、上記のサイトで試したところ正常な文字列に復号されました。これをなんとかVBAで実現したいと思っとおります、何卒、ご教授お願いします。

専門家に質問してみよう