質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

15712閲覧

phpのopensslを使用して暗号化した場合に英数字のみに変換することは出来ますか

red13

総合スコア79

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2016/04/01 06:29

phpのopensslを使用して暗号化、複合化をしています。
暗号化のときに「aa+bb/cc==」のように記号が含まれてしまいます。
これを「aabbcc99」のように英数字のみで暗号化にすることは出来ますか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

暗号化はこれ↓で行われているのでしょうか?

http://php.net/manual/ja/function.openssl-encrypt.php

aa+bb/cc==

おそらく base64 エンコードされているので、openssl_encrypt$optionsOPENSSL_RAW_DATA を指定して、返されたバイナリデータを適当な別の方法でエンコードすれば良いと思います。例えば bin2hex などです。

試していないですけれども、次のような感じでしょうか。

php

1$encrypted = bin2hex(openssl_encrypt($data, $method, $password, OPENSSL_RAW_DATA, $iv));

複合は逆に hex2bin を使います。

php

1$decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA, $iv);

投稿2016/04/01 07:12

編集2016/04/01 07:18
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

red13

2016/04/01 07:26

回答の通り、URLのopensslを使用しています。 暗号化は $encrypted = bin2hex(openssl_encrypt($data, $method, $password, OPENSSL_RAW_DATA)) で行い、複合化は $decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA) で問題ありませんでした。 $ivは無くてもできているので無いままかもしれません。
red13

2016/04/01 07:46

$decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA) を実行すると返却できませんでした。 データが長すぎると駄目だったりするんですかね?
ngyuki

2016/04/01 07:54

「返却できませんでした」というのはどういう状況でしょう? bin2hex によって本来のデータサイズの倍ぐらいになるので memory_limit にかかっているとか?
red13

2016/04/01 07:58

複合化する前に echo $encrypted; と見ると「aaabbb~」と変換された値が見えます。 $decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA) 上記の複合化後に echo $decrypted; を見ると何も表示されません。 echo $decrypted. "+"; とすると「+」だけ表示されます。
ngyuki

2016/04/01 08:00

なにかしら Warning がでているだろうので、error_reporting を -1 にして display_errors を on にしてためしてみるとよいと思います
red13

2016/04/01 08:38

現在の状況は以下の様になっています。 try { ini_set( 'display_errors', 1 ); error_reporting(-1); openssl_decrypt(~ 例外が発生する } catch(Exception $e) { エラー画面に遷移 } そのためエラー画面に遷移するため画面にエラーが表示されません。 また、ログには例外発生時の内容しか記載されていません。 そもそもこの記載が間違っていますかね?
red13

2016/04/01 08:41

追加情報です。 hex2bin($encrypted) は正常に表示されます。
ngyuki

2016/04/01 08:44

openssl_decrypt が例外を飛ばすことは考えにくいと思いますが・・set_error_handler でエラーハンドラを差し替えているのでしょうか?
red13

2016/04/01 08:47

申し訳ありません。 例外はopenssl_decryptとは違うところで発生しています。 openssl_decryptで返却した値をDBの検索条件に使用しており、DBから結果が取得できないため例外が発生しています。
ngyuki

2016/04/01 08:52

1. openssl_decrypt が出しているであろう Warning をなんらかの手段で確認する 2. bin2hex や hex2bin をなくして動作するかどうかを確認する
ngyuki

2016/04/01 08:54 編集

PHP の error_log を有効にして Warning や Notice がログにすればログから簡単に確認できます
red13

2016/04/01 08:54

openssl_decrypt(hex2bin($_POST['data'])~ だと取得できていました。しかし、 openssl_decrypt(hex2bin($_GET['data'])~ だと取得できていませんでした。 GETとPOSTで変わったりしますか?
ngyuki

2016/04/01 08:55

GET はクエリストリング、POST はリクエストボディで全然違います
ngyuki

2016/04/01 09:00 編集

GET でエンコードした値を受け取っているのだとしたら、クエリストリングが長くなりすぎて途中で切れているかもしれないので、POST で受け取るようにすると良いです
mpyw

2016/04/01 14:45

$iv があるのと無いのでレインボーテーブル攻撃に対する耐性の有無が大きく変わるので, $password をハードコーティングしているのでなければ $iv は毎回ランダムに生成し,暗号化された情報と紐つけて一緒に保存すべきです. (パスワードをハードコーディングするとサーバを乗っ取れば誰でも復号できてしまうのでそもそもあまり暗号化する意味がなくなる)
red13

2016/04/05 00:54

遅くなりました。 $_POSTで取得できる箇所は、取得できない箇所とは別の箇所です。 問題の箇所では$_POST、$_GETともに取得できませんでした。
red13

2016/04/05 00:55

パスワードはハードコーディングはしておらず、プロパティファイルで設定しています。
red13

2016/04/05 01:13

追加情報です。 bin2hexを使用せずに openssl_encrypt($data) で値を変換しました。 変換した値を openssl_decrypt(~) で元に戻すと上記と同じく取得できません。
red13

2016/04/05 01:20

申し訳ありません。解決しました。 原因は openssl_encryptのときにOPENSSL_RAW_DATAを指定せず、 openssl_decryptのときにOPENSSL_RAW_DATAを指定していました。 openssl_decryptでOPENSSL_RAW_DATAを指定すると、取得できるようになりました。 回答していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問