回答編集履歴
15
指摘部分を混乱防ぐために削除
answer
CHANGED
@@ -1,21 +1,10 @@
|
|
1
|
+
$url_textと$paramが不一致なのが問題なのでは?
|
2
|
+
|
1
3
|
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
4
|
|
3
|
-
|
5
|
+
この暗号化の2つの関数の相関性を説明すると
|
4
6
|
|
5
|
-
```php
|
6
|
-
//$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
|
7
|
-
$cipher = 'aes-256-cbc';
|
8
|
-
//$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
|
9
|
-
$options = 0;
|
10
|
-
$encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
|
11
|
-
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
7
|
```
|
13
|
-
|
14
|
-
$key、$ivともに暗号化、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
15
|
-
|
16
|
-
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
17
|
-
|
18
|
-
```
|
19
8
|
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは暗号化に用いる)
|
20
9
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは復号に用いる)
|
21
10
|
```
|
@@ -25,9 +14,6 @@
|
|
25
14
|
要は共通鍵はその部屋で作業するための鍵、ベクトルはその鍵を開けた部屋で暗号化、復号するためのアイテムです。
|
26
15
|
|
27
16
|
|
28
|
-
|
17
|
+
## 昨日のコメント
|
29
18
|
|
30
|
-
$共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
31
|
-
|
19
|
+
昨日のコメントは今後混乱を招く可能性があるので、一部削除しました。
|
32
|
-
|
33
|
-
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
14
復号の際は不要
answer
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
12
|
```
|
13
13
|
|
14
|
-
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
14
|
+
$key、$ivともに暗号化、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
15
15
|
|
16
16
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
17
17
|
|
13
これでわかるか
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
2
|
|
3
3
|
なので2箇所のハッシュ化部分をコメントアウトしてください。
|
4
4
|
|
@@ -11,7 +11,7 @@
|
|
11
11
|
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
12
|
```
|
13
13
|
|
14
|
-
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を
|
14
|
+
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
15
15
|
|
16
16
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
17
17
|
|
@@ -20,9 +20,11 @@
|
|
20
20
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは復号に用いる)
|
21
21
|
```
|
22
22
|
|
23
|
-
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで
|
23
|
+
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでベクトルを使用するためのものであって、暗号化に用いるベクトルそのものとは別物です。
|
24
24
|
|
25
|
+
要は共通鍵はその部屋で作業するための鍵、ベクトルはその鍵を開けた部屋で暗号化、復号するためのアイテムです。
|
25
26
|
|
27
|
+
|
26
28
|
そもそも、やり方がよくないです。
|
27
29
|
|
28
30
|
$共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
12
更に補足の補足
answer
CHANGED
@@ -11,8 +11,7 @@
|
|
11
11
|
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
12
|
```
|
13
13
|
|
14
|
-
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
15
|
-
|
14
|
+
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を取得**しています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、これだと共通鍵のキーワードも毎回ハッシュ化しているために、値が別物になってしまっています。
|
16
15
|
|
17
16
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
18
17
|
|
@@ -26,7 +25,7 @@
|
|
26
25
|
|
27
26
|
そもそも、やり方がよくないです。
|
28
27
|
|
29
|
-
$共通鍵に入れるキーワードは暗号化
|
28
|
+
$共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
30
29
|
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
31
30
|
|
32
31
|
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
11
keyもですね
answer
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号解読に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
2
|
|
3
|
-
なので
|
3
|
+
なので2箇所のハッシュ化部分をコメントアウトしてください。
|
4
4
|
|
5
5
|
```php
|
6
|
-
$key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
|
6
|
+
//$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
|
7
7
|
$cipher = 'aes-256-cbc';
|
8
8
|
//$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
|
9
9
|
$options = 0;
|
10
bintohex
answer
CHANGED
@@ -29,4 +29,4 @@
|
|
29
29
|
$共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
30
30
|
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
31
31
|
|
32
|
-
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`
|
32
|
+
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
9
ベクトルについて
answer
CHANGED
@@ -17,8 +17,8 @@
|
|
17
17
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
18
18
|
|
19
19
|
```
|
20
|
-
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号
|
20
|
+
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは暗号化に用いる)
|
21
|
-
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号
|
21
|
+
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは復号に用いる)
|
22
22
|
```
|
23
23
|
|
24
24
|
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
@@ -29,4 +29,4 @@
|
|
29
29
|
$共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
30
30
|
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
31
31
|
|
32
|
-
あとベクトル
|
32
|
+
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
8
更に補足
answer
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
```
|
13
13
|
|
14
14
|
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
15
|
-
それに、**hash関数は
|
15
|
+
それに、**hash関数は毎回毎回ランダムで文字列を取得**し、それをベクトルとしています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。
|
16
16
|
|
17
17
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
18
18
|
|
@@ -21,12 +21,12 @@
|
|
21
21
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
22
22
|
```
|
23
23
|
|
24
|
-
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
24
|
+
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
25
25
|
|
26
26
|
|
27
27
|
そもそも、やり方がよくないです。
|
28
28
|
|
29
|
-
$
|
29
|
+
$共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
30
|
-
なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わない方が無難です。
|
30
|
+
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
31
31
|
|
32
|
-
あと
|
32
|
+
あとベクトルは勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
7
そもそも、なぜ勘違いがおきたか
answer
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
```
|
13
13
|
|
14
14
|
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
15
|
+
それに、**hash関数は同じ文字列でも同じ暗号にならずに、毎回毎回ランダムで文字列を取得**します。なので、**同じ文字列でも暗号化ベクトルがランダムに変化する**ために、暗号化された文字列も毎回ランダムに変化します。
|
15
16
|
|
16
17
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
17
18
|
|
@@ -20,7 +21,7 @@
|
|
20
21
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
21
22
|
```
|
22
23
|
|
23
|
-
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで
|
24
|
+
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
24
25
|
|
25
26
|
|
26
27
|
そもそも、やり方がよくないです。
|
6
更に補足
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
21
21
|
```
|
22
22
|
|
23
|
-
なので**共通鍵、暗号解読用のベクトル
|
23
|
+
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
24
24
|
|
25
25
|
|
26
26
|
そもそも、やり方がよくないです。
|
5
なので
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
21
21
|
```
|
22
22
|
|
23
|
-
なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
23
|
+
なので**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
24
24
|
|
25
25
|
|
26
26
|
そもそも、やり方がよくないです。
|
4
更に補足
answer
CHANGED
@@ -11,12 +11,21 @@
|
|
11
11
|
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
12
|
```
|
13
13
|
|
14
|
-
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
|
14
|
+
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
15
15
|
|
16
|
+
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
16
17
|
|
18
|
+
```
|
19
|
+
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
20
|
+
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
21
|
+
```
|
22
|
+
|
23
|
+
なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
24
|
+
|
25
|
+
|
17
26
|
そもそも、やり方がよくないです。
|
18
27
|
|
19
28
|
$keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
20
|
-
なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使
|
29
|
+
なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わない方が無難です。
|
21
30
|
|
22
31
|
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。
|
3
ベクトル
answer
CHANGED
@@ -1,6 +1,22 @@
|
|
1
|
-
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
|
2
2
|
|
3
|
+
なので
|
4
|
+
|
5
|
+
```php
|
6
|
+
$key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
|
7
|
+
$cipher = 'aes-256-cbc';
|
8
|
+
//$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
|
9
|
+
$options = 0;
|
10
|
+
$encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
|
11
|
+
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
12
|
+
```
|
13
|
+
|
14
|
+
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
|
15
|
+
|
16
|
+
|
17
|
+
そもそも、やり方がよくないです。
|
18
|
+
|
3
19
|
$keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
4
20
|
なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使ってはいけません。
|
5
21
|
|
6
|
-
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたり化けたりします。そのためには`bitohex`関数
|
22
|
+
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。
|
2
理由
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
やり方が違いますよ。
|
2
2
|
|
3
|
-
$keyに入れるのは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。
|
4
|
-
だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
3
|
+
$keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
4
|
+
なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使ってはいけません。
|
5
5
|
|
6
6
|
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたり化けたりします。そのためには`bitohex`関数などを使ったりしてハッシュを数値化したりします。
|
1
暗号に修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
やり方が違いますよ。
|
2
2
|
|
3
|
-
$keyに入れるのは暗号化したハッシュではなく、暗号と
|
3
|
+
$keyに入れるのは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。
|
4
4
|
だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
5
5
|
|
6
6
|
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたり化けたりします。そのためには`bitohex`関数などを使ったりしてハッシュを数値化したりします。
|