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

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

ただいまの
回答率

90.50%

  • PHP

    20748questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 4,414

red13

score 71

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

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

aa+bb/cc==

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/01 16:26

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

    キャンセル

  • 2016/04/01 16:46

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

    キャンセル

  • 2016/04/01 16:54

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

    キャンセル

  • 2016/04/01 16:58

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

    キャンセル

  • 2016/04/01 17:00

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

    キャンセル

  • 2016/04/01 17:38

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

    キャンセル

  • 2016/04/01 17:41

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

    キャンセル

  • 2016/04/01 17:44

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

    キャンセル

  • 2016/04/01 17:47

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

    キャンセル

  • 2016/04/01 17:52

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

    キャンセル

  • 2016/04/01 17:53 編集

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

    キャンセル

  • 2016/04/01 17:54

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

    キャンセル

  • 2016/04/01 17:55

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

    キャンセル

  • 2016/04/01 17:59 編集

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

    キャンセル

  • 2016/04/01 23:45

    $iv があるのと無いのでレインボーテーブル攻撃に対する耐性の有無が大きく変わるので, $password をハードコーティングしているのでなければ $iv は毎回ランダムに生成し,暗号化された情報と紐つけて一緒に保存すべきです.

    (パスワードをハードコーディングするとサーバを乗っ取れば誰でも復号できてしまうのでそもそもあまり暗号化する意味がなくなる)

    キャンセル

  • 2016/04/05 09:54

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

    キャンセル

  • 2016/04/05 09:55

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

    キャンセル

  • 2016/04/05 10:13

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

    キャンセル

  • 2016/04/05 10:20

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    コンポーザを使ったLaravel 4のインストールについて(PHP)

    Laravel 4を試そうと思ったのですが インストール部分でつまずいてしまいました。 XAMMPを使っていて Laravel 4をコンポーザを使いインストールしようとしました。

  • 解決済

    (PHP)画像暗号化について

    PHPで画像を暗号化させたいのですが、ご存知の方、お教えください。 下記の場合は、鍵が存在しないようなので、すぐ解読されてしまいそう なので、他を使いたいと思っています。 ht

  • 受付中

    レンタルサーバー上でのメール送信のエラー

    PEAR::Mailでメールを送信を試していて うまく行ったのでレンタルサーバ(webcrowといいます)に上げてみたのですが こちらの方ではエラーが出ます PEAR::Mailの

  • 受付中

    php5.6.18にopensslをインストールするには

    CentOS6.7/PHP5.6.18/Apache2.4/MysqlComminityServer5.7 にてサーバ構築しています。 とりあえず、上記のものをインストールした

  • 解決済

    Laravelパッケージがインストールできません。

    初投稿です。 情報不足でしたら非常に申し訳ないのですが、ご指摘頂いてもよろしいでしょうか。 aws無料利用枠でLaravel5.1の環境を構築しようとしていたところ、以下の

  • 解決済

    PHP7用のBlowfish.php

    PHP5で動作していたWebシステムをPHP7にアップグレードしたら 使用してたCrypt_Blowfishが、コンストラクタの作りがクラス名と同名 になっていて、非推奨である

  • 解決済

    file_get_contentsでSSLエラー

    PHP 7.0.11 CakePHP 2.8.9 CentOS7 Apache 2.4.23 の環境でサイトを運用しております。 システム開発の経験は多いですが、サー

  • 受付中

    composerを使用してインストール

    composerを使用してphpフレームワークlumenをインストールしようとしています。 次のエラーがでてインストールすることができず困っています。 どなたかご教授お願いいた

同じタグがついた質問を見る

  • PHP

    20748questions

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