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

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

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

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

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Q&A

解決済

3回答

13560閲覧

PHPのCryPt関数でハッシュ化した値を復号したい

Kazuaki_Igarash

総合スコア16

PHP

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

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

0グッド

0クリップ

投稿2016/06/23 00:58

編集2016/06/24 00:40

###前提・実現したいこと
PHPのCryPt関数でハッシュ化した値を、復号したい

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

PHPのCryPt関数でハッシュ化した値を復号したいです。

crypt($str, SALT);を使ってハッシュ値を生成しています。
SALTはdefineで定義した固定文字列です。

結果、13桁のハッシュ値が生成されています。このハッシュ値とSALTを元に
元の$strを復号したいのですがうまくできません。

###該当のソースコード

PHP

1//SALT 2define(SALT , "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 3//ハッシュ化処理 4$str_hash = crypt($str, SALT);

PHP

1//復号化用のプログラム 2 3<?php 4//ハッシュ化された値(例) 5$str_hash = "ABCDEFGHIJKLM";(サンプル、実際には英数字の混ざった13桁のハッシュ値) 6 7//SALT 8$salt = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 9 10$str_encrypt = new StringEncrypt(); 11 12//暗号化 13$decrypted = $str_encrypt->decrypt($encrypted, $pass); 14echo $decrypted ."\n"; 15 16?> 17 18 19<?php 20class StringEncrypt 21{ 22 private $td; 23 private $iv_size; 24 private $algorithm; 25 private $mode; 26 private $init = false; 27 28 function __construct($algorithm="blowfish", $mode="ecb"){ 29 $this->algorithm = $algorithm; 30 $this->mode = $mode; 31 $this->td = mcrypt_module_open($this->algorithm, '', $this->mode, ''); 32 $this->iv_size = mcrypt_enc_get_iv_size($this->td); 33 } 34 35 function __destruct(){ 36 if($this->init) mcrypt_generic_deinit($this->td); 37 mcrypt_module_close($this->td); 38 } 39 40 private function init($pass, $iv=null){ 41 if(is_null($iv)){ 42 $iv = mcrypt_create_iv($this->iv_size, MCRYPT_DEV_RANDOM); 43 } else { 44 $iv = base64_decode($iv); 45 } 46 47 if($this->iv_size !== strlen($iv)){ 48 throw new Exception("Incorrect IV size."); 49 }; 50 51 $key = substr( md5($pass), 0, mcrypt_enc_get_key_size($this->td)); 52 mcrypt_generic_init($this->td, $key, $iv); 53 $this->init = true; 54 } 55 56 public function encrypt($str, $pass, $iv=null){ 57 $iv = $this->init($pass, $iv); 58 $encrypted = mcrypt_generic($this->td, $str); 59 return base64_encode($encrypted); 60 } 61 62 public function decrypt($str, $pass, $iv=null){ 63 echo $str; 64 $iv = $this->init($pass, $iv); 65 //$str = base64_decode($str); 66 $decrypted = mdecrypt_generic($this->td, $str); 67 echo $decrypted; 68 return rtrim($decrypted); 69 } 70 71 public function create_iv(){ 72 $iv = mcrypt_create_iv($this->iv_size, MCRYPT_DEV_RANDOM); 73 return base64_encode($iv); 74 } 75}

###試したこと
コマンドプロンプトで上記のプログラムで復号化しようと思いましたが、
出力値が文字化けしてしまい想定した値を得ることができなかった。

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 5.2.0(誤)
PHP 5.4.28(正)

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

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

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

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

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

guest

回答3

0

ベストアンサー

PHPマニュアルにも明記してありますが、

注意: 復号するための関数はありません。 crypt() が使用しているのは単方向アルゴリズムだからです。

crypt()関数は、パスワードのように、復元できないことに価値がある場面で使う関数です。

投稿2016/06/23 01:25

maisumakun

総合スコア145932

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

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

Kazuaki_Igarash

2016/06/24 00:30

ありがとうございます。crypt()関数は、復元できないという点、理解できました。
guest

0

そもそも**「何故復号が必要なのか」**についてもっと洗いだした方がいいかと思います.名前や住所を暗号化する場合は復号が必要なのも頷けますが,パスワードは復号できてはいけません.また,名前や住所であっても本当に暗号化する必要があるのかについてはよく検討してください.

PHP5.5以降からはcryptよりも使いやすいpassword_hashの使用が推奨されているのでそちらで
と,言いたいところですが太古のPHP5.2を使われているようですね…
何かしら事情があるのかもしれませんが,可能な場合はアップデートを推奨します.

投稿2016/06/23 01:36

mpyw

総合スコア5223

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

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

mpyw

2016/06/23 01:40

というか5.2.xの最新版じゃなくて5.2.0なので脆弱性あるんじゃないですかね.めちゃくちゃ危ないと思いますよ.バグもたくさんありますし.
Kazuaki_Igarash

2016/06/24 00:37

ありがとうございます。cryptについて理解できました。 バージョンの記載誤りがありました。PHP 5.4.28でした。 ただ、PHP 5.4.28もだいぶ古いのでアップデートを検討しています。アドバイスありがとうございました。
guest

0

ハッシュについて誤解されているように思います。

ハッシュはハッシュから元の値に戻せない必要があります。
また、複数の異なる値が同じハッシュになる場合もあります。

元に戻す必要があるのであれば、
ハッシュではなく可逆暗号化を行う必要があります。
例えばPHPマニュアル mcrypt_generic()等を使います。

投稿2016/06/23 01:04

tanat

総合スコア18716

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

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

tanat

2016/06/23 01:13 編集

コメントに誤解があったので削除します。
tanat

2016/06/23 01:22 編集

class StringEncryptでは暗号化メソッドencrypt()が実装されているようなので、 何か理由が無い限りは暗号化の際はこのクラスのencrypt()を使用するのがベストかと思います。
Kazuaki_Igarash

2016/06/24 00:31

回答ありがとうございます。 crypt()関数は、復元できないという点、理解できました。復号化が必要な場合は、mcrypt_generic()などの可逆暗号化を使うようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問