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

回答編集履歴

1

パスワードから鍵・IVを得る方法について補足

2021/10/26 11:16

投稿

angel_p_57
angel_p_57

スコア1681

answer CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  …ただ、1. で指定したパスワードから鍵・IVを知る方法は、PHPの中ではおそらくありません。
13
13
  ということで、今回は openssl コマンドを直接呼び出して復号する他はなさそうに思います。
14
- ※暗号化時PBKDF2を使っていれば、あるいはPHPなんとかできる可能性はありますが
14
+ → 追記: opensslの内部動作依存した方法ではありますが、鍵・IVを知る方法がありました。末尾に追記します
15
15
 
16
16
  参考までに、以下 1, 2 の方法の違いです。
17
17
 
@@ -48,4 +48,15 @@
48
48
  $keyhex="D2F94536C4F265D45FA439982476D5B877ED0D209D6627F41C326CDF07550FCC";
49
49
  $ivhex ="B7B74563864C3A86FFCDAF0DB97B069A";
50
50
  echo openssl_decrypt(substr($enc,16),"aes-256-cbc",hex2bin($keyhex),OPENSSL_RAW_DATA,hex2bin($ivhex));
51
+ ```
52
+
53
+ ※追記
54
+ パスワード・salt→鍵・IVを知る方法はopenssl独自ですが、一応次の方法で真似ることはできます。ただ、指定するオプションによって細部は変わってきます。今回はデフォルト ( -md 未指定=sha256, pbkdf2 未使用 ) に対応した方法です。
55
+
56
+ ```
57
+ $pass="xyz";
58
+ $salt=substr($enc,8,8);
59
+ $key=openssl_digest($pass.$salt,"sha256",true);
60
+ $iv=substr(openssl_digest($key.$pass.$salt,"sha256",true),0,16);
61
+ echo openssl_decrypt(substr($enc,16),"aes-256-cbc",$key,OPENSSL_RAW_DATA,$iv);
51
62
  ```