回答編集履歴

15

指摘部分を混乱防ぐために削除

2021/06/02 00:51

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -1,34 +1,12 @@
1
+ $url_textと$paramが不一致なのが問題なのでは?
2
+
3
+
4
+
1
5
  openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
2
6
 
3
7
 
4
8
 
5
- 2箇所ハッシュ化部分コメントアウトしてください。
6
-
7
-
8
-
9
- ```php
10
-
11
- //$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
12
-
13
- $cipher = 'aes-256-cbc';
14
-
15
- //$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
16
-
17
- $options = 0;
18
-
19
- $encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
20
-
21
- $decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
22
-
23
- ```
24
-
25
-
26
-
27
- $key、$ivともに暗号化、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
28
-
29
-
30
-
31
- ちなみに、この暗号化の2つの関数の相関性を説明すると
9
+ 暗号化の2関数の相関性説明すると
32
10
 
33
11
 
34
12
 
@@ -52,14 +30,8 @@
52
30
 
53
31
 
54
32
 
55
- そもそも、やり方がよくないです。
33
+ ## 昨日のコメント
56
34
 
57
35
 
58
36
 
59
- $共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
60
-
61
- で**共通鍵にハッシュ使うと、同じ文字列でも毎回対応のキーワード変わってしまう**ので、データ管理が困難になり使わない方が無難です
37
+ 昨日コメントは今後混乱招く可能性あるので、一部削除しました
62
-
63
-
64
-
65
- あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。

14

復号の際は不要

2021/06/02 00:51

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- $key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
27
+ $key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
28
28
 
29
29
 
30
30
 

13

これでわかるか

2021/06/01 06:29

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -1,4 +1,4 @@
1
- openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号解読に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
1
+ openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
2
2
 
3
3
 
4
4
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- $key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を取得**しています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、これだと共通鍵のキーワードも毎回ハッシュ化しているために、値が別物になってしまっています。
27
+ $key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化している、値が別物になってしまっています。
28
28
 
29
29
 
30
30
 
@@ -42,7 +42,11 @@
42
42
 
43
43
 
44
44
 
45
- なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号結びつけるものであって、暗号化に用いるベクトルとは別物です。
45
+ なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでベクトル使用すためのものであって、暗号化に用いるベクトルそのものとは別物です。
46
+
47
+
48
+
49
+ 要は共通鍵はその部屋で作業するための鍵、ベクトルはその鍵を開けた部屋で暗号化、復号するためのアイテムです。
46
50
 
47
51
 
48
52
 

12

更に補足の補足

2021/06/01 06:28

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -24,9 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
28
-
29
- それに、**hash関数は毎回毎回ランダムで文字列を取得**し、それをベクトルとしています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。
27
+ $key、$ivとも暗号復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を取得**しています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、これだと共通鍵のキーワードも毎回ハッシュ化しているために、値が別物になってしまっています。
30
28
 
31
29
 
32
30
 
@@ -54,7 +52,7 @@
54
52
 
55
53
 
56
54
 
57
- $共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
55
+ $共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
58
56
 
59
57
  なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
60
58
 

11

keyもですね

2021/06/01 06:17

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -1,14 +1,14 @@
1
- openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
1
+ openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号解読に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
2
2
 
3
3
 
4
4
 
5
- なので
5
+ なので2箇所のハッシュ化部分をコメントアウトしてください。
6
6
 
7
7
 
8
8
 
9
9
  ```php
10
10
 
11
- $key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
11
+ //$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
12
12
 
13
13
  $cipher = 'aes-256-cbc';
14
14
 

10

bintohex

2021/06/01 06:15

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -60,4 +60,4 @@
60
60
 
61
61
 
62
62
 
63
- あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
63
+ あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。

9

ベクトルについて

2021/06/01 06:11

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -36,9 +36,9 @@
36
36
 
37
37
  ```
38
38
 
39
- 暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
39
+ 暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは暗号化に用いる)
40
40
 
41
- 対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
41
+ 対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは復号に用いる)
42
42
 
43
43
  ```
44
44
 
@@ -60,4 +60,4 @@
60
60
 
61
61
 
62
62
 
63
- あとベクトルは勝手文字がカトされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
63
+ あとベクトル作成用いるハシュはエンコードの関係で文字が化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。

8

更に補足

2021/06/01 05:16

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
28
28
 
29
- それに、**hash関数は同じ文字列でも同じ暗号にならずに、毎回毎回ランダムで文字列を取得**します。なので、**同じ文字列でも暗号化ベクトルがランダムに変化る**ために、暗号化された文字列も毎回ランダムに変化します。
29
+ それに、**hash関数は毎回毎回ランダムで文字列を取得**し、それをベクトルとしています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。
30
30
 
31
31
 
32
32
 
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
47
+ なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
48
48
 
49
49
 
50
50
 
@@ -54,10 +54,10 @@
54
54
 
55
55
 
56
56
 
57
- $keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
57
+ $共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
58
58
 
59
- なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わない方が無難です。
59
+ なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
60
60
 
61
61
 
62
62
 
63
- あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。
63
+ あとベクトルは勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。

7

そもそも、なぜ勘違いがおきたか

2021/06/01 05:03

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -26,6 +26,8 @@
26
26
 
27
27
  $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
28
28
 
29
+ それに、**hash関数は同じ文字列でも同じ暗号にならずに、毎回毎回ランダムで文字列を取得**します。なので、**同じ文字列でも暗号化ベクトルがランダムに変化する**ために、暗号化された文字列も毎回ランダムに変化します。
30
+
29
31
 
30
32
 
31
33
  ちなみに、この暗号化の2つの関数の相関性を説明すると
@@ -42,7 +44,7 @@
42
44
 
43
45
 
44
46
 
45
- なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
47
+ なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
46
48
 
47
49
 
48
50
 

6

更に補足

2021/06/01 04:56

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- なので**共通鍵、暗号解読用のベクトル一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
45
+ なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味でなく、共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
46
46
 
47
47
 
48
48
 

5

なので

2021/06/01 04:49

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
45
+ なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
46
46
 
47
47
 
48
48
 

4

更に補足

2021/06/01 04:43

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -24,7 +24,25 @@
24
24
 
25
25
 
26
26
 
27
- $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
27
+ $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です
28
+
29
+
30
+
31
+ ちなみに、この暗号化の2つの関数の相関性を説明すると
32
+
33
+
34
+
35
+ ```
36
+
37
+ 暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
38
+
39
+ 対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
40
+
41
+ ```
42
+
43
+
44
+
45
+ なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
28
46
 
29
47
 
30
48
 
@@ -36,7 +54,7 @@
36
54
 
37
55
  $keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
38
56
 
39
- なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使ってはけません
57
+ なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わな方が無難です
40
58
 
41
59
 
42
60
 

3

ベクトル

2021/06/01 04:42

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -1,4 +1,36 @@
1
+ openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
2
+
3
+
4
+
5
+ なので
6
+
7
+
8
+
9
+ ```php
10
+
11
+ $key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
12
+
13
+ $cipher = 'aes-256-cbc';
14
+
15
+ //$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
16
+
17
+ $options = 0;
18
+
19
+ $encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
20
+
21
+ $decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
22
+
23
+ ```
24
+
25
+
26
+
27
+ $ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
28
+
29
+
30
+
31
+
32
+
1
- やり方が
33
+ そもそも、やり方がよくなす。
2
34
 
3
35
 
4
36
 
@@ -8,4 +40,4 @@
8
40
 
9
41
 
10
42
 
11
- あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたり化けたりします。そのためには`bitohex`関数などを使ったりしてハッシュを数値化したりします。
43
+ あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。

2

理由

2021/06/01 04:30

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- $keyに入れるは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。
5
+ $keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
6
6
 
7
- だから'生麦生米生卵'もいいですがそれを見つからな場所に置いたりし
7
+ なので**ハッシュを使う毎回キーワードが変わってしまう**ので、使ってはせん
8
8
 
9
9
 
10
10
 

1

暗号に修正

2021/06/01 03:15

投稿

FKM
FKM

スコア3647

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- $keyに入れるのは暗号化したハッシュではなく、暗号と複合用の共通の合言葉となる文字列です。
5
+ $keyに入れるのは暗号化したハッシュではなく、暗号化用復号用の共通の合言葉となる文字列です。
6
6
 
7
7
  だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
8
8