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

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

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

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

PHP

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

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

Q&A

解決済

1回答

8921閲覧

PHPのopenssl_decrypt()でopensslコマンドによって暗号化したデータを復元できない

Yukizakura

総合スコア7

OpenSSL

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

PHP

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

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

0グッド

1クリップ

投稿2017/03/23 00:59

###実現したいこと
opensslコマンドで生成した暗号文をPHPのopenssl_decrypt()で復号したいのですが上手く行きません。
暗号化には、aes-256-cbcを使用しています。

###発生している問題
・PHP : key, ivは算出できているが復号できない。

###該当のソースコード

BASH

1$ echo "rawdata" | openssl enc -e -aes-256-cbc -base64 -pass pass:password -p 2salt=420D3EFAD8B50CDA 3key=6DE400E56736822A64A0C714F15AD1917DB4EBE17A60305C37721488F03E7E40 4iv =F7D4A93D15A137F864866189F9D64DA1 5U2FsdGVkX19CDT762LUM2v9Er/lUtkGsle2RiY1nQdE=

上記で得た暗号文を事前に共有しておいたpass(password)で復号するプログラム

PHP

1<?php 2 $secret = "password"; // 事前に共有 3 $b64_send_data = "U2FsdGVkX19CDT762LUM2v9Er/lUtkGsle2RiY1nQdE="; 4 $send_data = base64_decode($b64_send_data); 5 6 // 'Salted__'+'salt 8byte'+'encrypt data' 暗号文からsaltを分離 7 $bin_salt = substr($send_data, 8, 8); 8 $hex_salt = bin2hex($bin_salt); 9 $encrypt = substr($send_data, 16); 10 11 // secretとsaltからkey, iv生成 EVP_BytesToKey()の簡易版 12 $hash1 = openssl_digest($secret . $bin_salt, 'md5'); 13 $hash2 = openssl_digest(hex2bin($hash1) . $secret . $bin_salt, 'md5'); 14 $key = $hash1 . $hash2; 15 $iv = openssl_digest(hex2bin($hash2) . $secret . $bin_salt, 'md5'); 16 17 $decrypt = openssl_encrypt($encrypt, 'aes-256-cbc', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv)); 18 19 echo "salt=". $hex_salt ."<br>"; 20 echo "key=". $key ."<br>"; 21 echo "iv =". $iv ."<br>"; 22 echo "decrypt : ". $decrypt ." (". bin2hex($decrypt) .") " ."<br>"; 23 echo "openssl target : rawdata ". bin2hex("rawdata") ."<br>"; 24?> 25 26-- 実行結果 -- 27salt=420d3efad8b50cda 28key=6de400e56736822a64a0c714f15ad1917db4ebe17a60305c37721488f03e7e40 29iv =f7d4a93d15a137f864866189f9d64da1 30decrypt : (省略) (e253655c7f75cf721da65fc95a4405f2d5834766a63e693550ff1047d3d84956) 31openssl target : rawdata (72617764617461)

###実行情報
PHP 7.1.1 (cli) (built: Feb 13 2017 10:05:49) ( NTS )
php -S でビルトインサーバを立てて実行

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

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

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

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

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

guest

回答1

0

ベストアンサー

$decrypt = openssl_encrypt($encrypt, 'aes-256-cbc', hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv));

openssl_decryptでは?
実際にやってないのでココだけではないかもしれませんが。

投稿2017/03/23 05:58

takepieee

総合スコア686

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

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

Yukizakura

2017/04/01 12:20 編集

``` decrypt : rawdata (726177646174610a) ``` 意図した通りにできました。 元々はsalt同じでもopensslと同じ暗号文が生成されないことで悩んでいたんですが、 投稿用に書き換えた時に直し忘れていたようです。 でも、おかげでLFが挿入されてるからという原因も分かり良かったです。 ありがとうございました。 しかし、このLFはstr_replace(array("\r\n", "\r", "\n"), '', $text);で 暗号化前に消そうとしても消えないのが困りどころです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問