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

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

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

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

PHP

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

Q&A

解決済

1回答

3273閲覧

【PHP7】OpenSSLの復号が上手くいかない

退会済みユーザー

退会済みユーザー

総合スコア0

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

PHP

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

0グッド

1クリップ

投稿2017/07/31 03:39

編集2017/07/31 04:43

このページを参考に暗号化と復号の処理を書いていたのですが、復号だけが上手くいきません。

$password = 'AgNQhlwjGf0qtpZy3WAt2A=='; //'test'の暗号化 $key = 'password1234'; $method = 'aes-128-cbc'; $ivLength = openssl_cipher_iv_length($method); $iv = openssl_random_pseudo_bytes($ivLength); $options = 0; $decrypt = openssl_decrypt($password, $method, $key, $options, $iv); 結果 false

特にエラーが出ているわけでもないので何がダメなのかさっぱりです。どこかおかしなところはありますでしょうか?

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

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

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

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

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

otn

2017/07/31 04:00

復号化?
退会済みユーザー

退会済みユーザー

2017/07/31 04:17

間違えてました(´・ω・`)
tacsheaven

2017/07/31 04:28

平文を暗号にするのは「暗号化」なんですが、暗号文を平文に戻すのは「復号」であって復号化じゃないんですねこれが
退会済みユーザー

退会済みユーザー

2017/07/31 04:41

奥が深い(´・ω・`)
guest

回答1

0

ベストアンサー

暗号化したものを復号する場合、特に共通鍵暗号の場合は、次の3つが必要になります。
0. 暗号文そのもの
0. 暗号化時に与えた鍵
0. 同じく、暗号化時に与えた初期化ベクトル(iv)

挙げられたコードだと、暗号化したときと iv が異なるでしょうから、復号に失敗するのは当然です。


なぜ初期化ベクトルがあるのか:
AESはブロック暗号です。ブロック単位で暗号化を行い、ひとつ前のブロックの(暗号化後の)情報をもとに次のブロックの暗号化を行います。
ということは、もし平文の「先頭のブロック」が同一の情報であった場合、暗号化した後の先頭のブロックもまた同一になってしまいます。
※例えばビジネスメールの先頭によくある、「拝啓 貴社ますますご清栄のことと…」のような定型文があれば、その部分は同じになってしまいます。
これでは、平文「そのもの」はわからないにしても、「似たような文書である」ということが分かってしまい、暗号としては強度が落ちます。

これを回避するために、先頭のブロックのさらに前に、「毎回ランダムな」ブロックを一つ用意して、暗号化後の先頭ブロックが同一になるのを避けています。これが初期化ベクトルです。(なので初期化ベクトルはブロック長と同一サイズになる)
当然、復号する際にこの初期化ベクトルが分からなければ、まともに復号できません。
※当然ながら、初期化ベクトルを毎回同一にしてしまっては意味がありません

投稿2017/07/31 03:51

編集2017/07/31 04:02
tacsheaven

総合スコア13703

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

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

退会済みユーザー

退会済みユーザー

2017/07/31 04:16

返答と解説ありがとうございます。ivを固定にすることで解決はできたのですが、それではあまり意味がないということですかね。しかしだからといってivを固定にしない限りは複合はできないということなのでしょうか?
tacsheaven

2017/07/31 04:24

暗号文と同時に、ivも渡す(あるいは何かしらの条件から生成するようにする)必要がある、ということです。 例えばメールの送信日時をベースにしてivを構築するとかですね。
退会済みユーザー

退会済みユーザー

2017/07/31 04:43

つまりは暗号文を生成するときに使ったivをDBで覚えておかないとだめということですよね?
tacsheaven

2017/07/31 04:44

そういうことです。iv そのものか、あるいは何かしらの情報から一意にivを作れればよいです。
退会済みユーザー

退会済みユーザー

2017/07/31 04:52

なるほど、よくわかりました。お付き合いいただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問