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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

2551閲覧

JavaScript(以下JS) と PHP での暗号化・復号について質問です.

Pccla

総合スコア35

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

2クリップ

投稿2018/02/09 10:23

編集2018/02/13 10:39

JavaScript(以下JS) と PHP での暗号化・復号について質問です.

JSでの暗号化には CryptoJS,
PHP側での復号にはopenssl_decryptを使います.

以下のようにJSで暗号したのですが、PHPで復号できず困っています.
セキュリティ的に安全であれば他の方法でも構いませんので、どこが原因かご教示いただけると幸いです!!

JS側での暗号化

lang

1 // 暗号化用パス 2 var secretPass = CryptoJS.enc.Utf8.parse('pass'); 3 // ランダム値生成してsaltを設定 4 var salt = CryptoJS.lib.WordArray.random(128 / 16); 5 // 暗号化で使うキーを設定(先ほど作ったsecretPassとsaltを使用) 6 var key = CryptoJS.PBKDF2(secretPass, salt, {keySize: 128 / 16, iterations: 1000 }); 7 //初期化ベクトル 8 var iv = CryptoJS.lib.WordArray.random(128 / 16); 9 //暗号化オプション(IV:初期化ベクトル, CBCモード, パディングモード:PKCS7) 10 var options = {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}; 11 //暗号化内容のエンコーディングは「UTF-8」 12 var baseText = CryptoJS.enc.Utf8.parse('IWantToDecryptThisString'); 13 14 //暗号化 15 var encrypted = CryptoJS.AES.encrypt(baseText, key, options);

PHPでは復号のメソッドを作り、openssl_decrypt関数を実行した時点での
ログを出力したところ、返り値は空っぽでした.
以下PHPの復号メソッドで、引数自体は渡ってきてます.

$encData : yWvjtqSQKl8kzJwgeri%2BtA%3D%3D
$iv : 49bb573d407b4b64d20445f0c4b20279
$key : bcbc43c15b482e4579529039ecbd32345b2f462f796f904a0eceffed93d5186da7f609c40a303f497a68615e14474b5f73f7f66bb80df298d5918fc1a9120eec

$encData : bnqTjLlAWs0aAZZkX7kZnw==
$iv : 682efaee374ec613
$key : 5b4076f60e3fb3a0649a5fcf1fb71e551f634a5017b6d529cffc65c06eb34724

lang

1 public function decData( $encData, $iv, $key ){ 2 $decData = ''; 3 // 復号に使うメソッド 4 $method = 'AES-128-CBC'; 5 // 復号に使うオプション 6 $options = 'OPENSSL_RAW_DATA'; 7 8 // 復号 9 //$decData = openssl_decrypt(pack("H*", $encData), $method, $key, $options, $iv); 10 $urlDecodeEncData = urldecode($encData); 11 $decData = openssl_decrypt($urlDecodeEncData, $method, $ky, $options, $iv); 12 13$this->log('復号処理結果', LOG_INFO); 14// 以下のログは空っぽでした 15$this->log($decData, LOG_INFO); 16 17 return $decData; 18 }

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

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

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

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

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

guest

回答3

0

ベストアンサー

JS側で生成するivの長さが間違っているようです
また、php側での複合化に使うメソッドが違うようです

下記で動作サンプルになります

js

javascript

1// 暗号化用パス 2var secretPass = CryptoJS.enc.Utf8.parse('pass'); 3 4// ランダム値生成してsaltを設定 5var salt = CryptoJS.lib.WordArray.random(128 / 16); 6 7// 暗号化で使うキーを設定(先ほど作ったsecretPassとsaltを使用) 8var key = CryptoJS.PBKDF2(secretPass, salt, {keySize: 128 / 16, iterations: 1000 }); 9 10//初期化ベクトル 11var iv = CryptoJS.lib.WordArray.random(128 / 8); 12 13//暗号化オプション(IV:初期化ベクトル, CBCモード, パディングモード:PKCS7) 14var options = {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}; 15 16//暗号化内容のエンコーディングは「UTF-8」 17var baseText = CryptoJS.enc.Utf8.parse('IWantToDecryptThisString'); 18 19//暗号化 20var encrypted = CryptoJS.AES.encrypt(baseText, key, options); 21 22// UA2EX1WGut9X0r3KyGvja0rJoTLGGuqt548VqOC2uS4= 23console.log(CryptoJS.enc.Base64.stringify(encrypted.ciphertext)) 24 25// 448e82b5ba5ce418b1e89f720af3e0680c8b6958f3050632849dfc028fa8784e 26console.log(CryptoJS.enc.Hex.stringify(key)) 27 28// 6f0d81e8371d8befb39054ae2f969f36 29console.log(CryptoJS.enc.Hex.stringify(iv))

php

php

1<?php 2 3function decData( $encData, $iv, $key ) { 4 $encData = base64_decode($encData); 5 $iv = hex2bin($iv); 6 $key = hex2bin($key); 7 8 // 復号に使うメソッド 9 $method = 'AES-256-CBC'; 10 11 // 復号に使うオプション 12 $options = OPENSSL_RAW_DATA; 13 14 $decData = openssl_decrypt($encData, $method, $key, OPENSSL_RAW_DATA, $iv); 15 16 return $decData; 17} 18 19$encData = "UA2EX1WGut9X0r3KyGvja0rJoTLGGuqt548VqOC2uS4="; 20$key = "448e82b5ba5ce418b1e89f720af3e0680c8b6958f3050632849dfc028fa8784e"; 21$iv = "6f0d81e8371d8befb39054ae2f969f36"; 22 23var_dump(decData( $encData, $iv, $key ));

投稿2018/02/13 14:07

編集2018/02/13 16:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/02/13 14:43

ちょっと興味がでてきて、色々調べていたところでした。 横からですが、ありがとうございます。 大変勉強になりました。 CryptoJS のドキュメントが結構探しにくいですね^^; https://code.google.com/archive/p/crypto-js/ ここを見て、絶望して、コードを読み始めたところだったのですけど。。。 どこ見るのが正解だったんでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/13 16:23

初めまして 今回の件ですと自分の場合下記の流れでした。 初めて知る事もあり、とても勉強になった良い機会です。 ・実際にJSとPHPを実装してみる ・動作中に出るエラーを調べる ・関数のドキュメントを読む ・英語でググる ・共通鍵の暗号化について調べる
退会済みユーザー

退会済みユーザー

2018/02/13 16:26

参考になるかわかりませんが、、、 あまり触れたことのない部分について調べる時は、 いきなりドキュメントに行かず、多少ググってからの方が手応えあると感じます。
退会済みユーザー

退会済みユーザー

2018/02/13 22:44

コメントありがとうございます。 > ・関数のドキュメントを読む ここがうまくいかなかったんですよね^^; CryptoJS.PBKDF2 のデフォルトの設定が確認ができず、迷走してしまいました。 修正前の回答が大変参考になりました。 学習のため、もう少し追いかけてみます。
Pccla

2018/02/14 03:13

ありがとうございます!ご教示いただいた通り、動かしたところ暗号化・復号できました!! ただ、こちらのPHPのバージョンが5.3とかなり古い状態なので、hex2binが使えず、代わりにpack('H*',)を使いました。
Pccla

2018/02/14 03:16

先にご回答いただいたお二方のご意見も大変勉強になりました! 私のググる力などが弱く、もの凄く困っているところを助けていただき本当にありがとうございました!! 感謝ですm(_ _)m このあたりの分野は初めてだったので、もう少しググったりして理解度を深めようと思います。
guest

0

デバッグとしては 2 手順を試してください。

1,$decData = openssl_decrypt(pack("H*", $encData), $method, $key, $params['options'], $iv);の各変数に、投入されているべきデータを実際に投入してみて意図したモノが返却されているか?

2,$decData = openssl_decrypt(pack("H*", $encData), $method, $key, $params['options'], $iv);時点でのそれぞれの変数が意図したものになっているのか?

1 が変であれば、openssl_decrypt の使用方法をもう一度確認します。
2 が変であれば、変数を追うことで、問題箇所が特定できます。

デバッグの環境さえ整えてあれば、それほど難しい切り分けではないと思います。

追記
本回答は、「PHP での暗号化・復号について」の回答ではなく、ただのデバッグに関しての記述です。

php

1<?php 2$encData = 'yWvjtqSQKl8kzJwgeri%2BtA%3D%3D'; 3$iv = '49bb573d407b4b64d20445f0c4b20279'; 4$key = 'bcbc43c15b482e4579529039ecbd32345b2f462f796f904a0eceffed93d5186da7f609c40a303f497a68615e14474b5f73f7f66bb80df298d5918fc1a9120eec'; 5$decData = ''; 6// 復号に使うメソッド 7$method = 'AES-128-CBC'; 8// 復号に使うオプション 9$options = OPENSSL_RAW_DATA; 10// 復号 11$decData = openssl_decrypt(pack("H*", $encData), $method, $key, $params['options'], $iv);
PHP Warning: pack(): Type H: illegal hex digit y in /workspace/Main.php on line 11 PHP Warning: pack(): Type H: illegal hex digit W in /workspace/Main.php on line 11 PHP Warning: pack(): Type H: illegal hex digit v in /workspace/Main.php on line 11 … PHP Warning: pack(): Type H: illegal hex digit % in /workspace/Main.php on line 11 PHP Notice: Undefined variable: params in /workspace/Main.php on line 11 PHP Warning: openssl_decrypt(): IV passed is 32 bytes long which is longer than the 16 expected by selected cipher, truncating in /workspace/Main.php on line 11

$encData がおかしいんじゃないですか?

投稿2018/02/13 01:12

編集2018/02/13 04:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/02/13 01:22 編集

これ、普通に Warning が出ませんか?
Pccla

2018/02/13 02:44

ブラウザの開発者ツールでエラーが確認できました。 JSからパラメータ送付したときに、そのパラメータの末尾に「=:1 Uncaught SyntaxError: Unexpected token <」というエラーでした。 普段JSをあまり触らずググったんですが、JS側の実装に問題があるということでしょうか?
Pccla

2018/02/13 02:57 編集

詳細には下記のようなエラーが出てました。 ``` <pre class="cake-error"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr5a8251fd4f47a-trace').style.display = (document.getElementById('cakeErr5a8251fd4f47a-trace').style.display == 'none' ? '' : 'none');"><b>Notice</b> (8)</a>: Use of undefined constant OPENSSL_RAW_DATA - assumed 'OPENSSL_RAW_DATA' [<b>/usr/decdata.php</b>, line <b>98</b>]<div id="cakeErr5a8251fd4f47a-trace" class="cake-stack-trace" style="display: none;"><a href="javascript:void(0);" onclick="document.getElementById('cakeErr5a8251fd4f47a-code').style.display = (document.getElementById('cakeErr5a8251fd4f47a-code').style.display == 'none' ? '' : 'none')">Code</a> <a href="javascript:void(0);" onclick="document.getElementById('cakeErr5a8251fd4f47a-context').style.display = (document.getElementById('cakeErr5a8251fd4f47a-context').style.display == 'none' ? '' : 'none')">Context</a><pre id="cakeErr5a8251fd4f47a-code" class="cake-code-dump" style="display: none;"><code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ivLength'&nbsp;=&gt;&nbsp;$ivLength, </span></code> <code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'iv'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;$iv, </span></code> <span class="code-highlight"><code><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'options'&nbsp;&nbsp;=&gt;&nbsp;OPENSSL_RAW_DATA, </span></code></span></pre><pre id="cakeErr5a8251fd4f47a-context" class="cake-context" style="display: none;">$key = &#039;LDH_poker_score&#039; $method = &#039;AES-128-CBC&#039; $ivLength = (int) 16 </pre><pre class="stack-trace">LdhComMypageGameScoreComponent::setCondition() - /usr/decDataComponent.php, line 98 LdhComMypageGameScoreComponent::decData() - /usr/decdata.php, line 150 MypageGameScoreController::index() - APP/decDataController.php, line 170 ReflectionMethod::invokeArgs() - [internal], line ?? Controller::invokeAction() - CORE/Cake/Controller/Controller.php, line 485 Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 186 Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 161 [main] - APP/webroot/index.php, line 93</pre></div></pre> ```
退会済みユーザー

退会済みユーザー

2018/02/13 04:37

JavaScript 側をコメントするつもりはありません。 追記した通り、php 側のデバッグに関してのみ回答しています。 切り分けの参考になれば。
Pccla

2018/02/13 05:14

ありがとうございます。 おっしゃる通り追記いただいたエラーが出ました。
mpyw

2018/02/13 09:25

>> $encData = 'yWvjtqSQKl8kzJwgeri%2BtA%3D%3D'; 明らかに `urldecode` が必要そうな見た目してるw
Pccla

2018/02/13 10:32

ありがとうございます。デコードまで行いまして、「bnqTjLlAWs0aAZZkX7kZnw==」のような形になりました。 あと現時点でopenssl_decryptでpack()は必要なくなったので、外しました。
Pccla

2018/02/13 10:58

返り値は相変わらず空で、今度はエラーもでないので、困ってます...
退会済みユーザー

退会済みユーザー

2018/02/13 22:55

openssl_decrypt の返り値が false になるので、復号に失敗しています。 与える引数がおかしいということになるので、中で使っている変数を見直す必要があります。 で、少し追いかけてみたのですが、そもそもの処理としておかしな点が多くありました。根本的に見直してみないと解決しないようです。 具体的には以下の見直しが必要かと ・暗号化手順の確認 ・復号手順の確認 ・各種パラメータの作成方法の確認 ・使用関数の挙動確認(デフォルト設定内容の確認を含む) 言語を渡るので、使用関数の設定内容を合わせることが必要になります。 esuzuki さんの回答を、修正前の履歴も含めて追っかけてみると、前に進めると思います。
Pccla

2018/02/14 07:31

JS側でのエンコードの仕方、ivの長さ、 PHP側でデコードの仕方と復号メソッドなど色々間違っておりました。 ご教示いただきありがとうございました!
guest

0

php

1$options = 'OPENSSL_RAW_DATA';

php

1$options = OPENSSL_RAW_DATA;

投稿2018/02/09 20:12

mpyw

総合スコア5223

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

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

Pccla

2018/02/13 01:05

返答が遅くなり申し訳ございません。 シングルクオテーションを外してみたんですが、返り値は空でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問