teratail
質問するログイン新規登録

Q&A

解決済

3回答

14297閲覧

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

0

0

###前提・実現したいこと
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

回答の取得に失敗しました

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

ただいまの回答率
%

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

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

質問する

関連した質問