2017-02-16 8 views
1

openSSLを使用しているLinux Webサーバー上で実行されているWindows 64マシン(私のPC)とPHP間の単純な暗号化/ 。Linux Webサーバー上で実行されているWindows PCとPHP間のopenSSLを暗号化/復号化する

私のWindowsマシンでは、OpenSSL v1.0.2kをWin64用にインストールしました。次のコマンドを使用して、単純なパスワードとsecretkey.txtにある単純なキーを使用して暗号化された文字列を作成します。

enc -aes-256-cbc -A -base64 -nopad -nosalt -pass pass:hello -in secretkey.txt

私は上記のコマンドを実行すると、私は次の文字列を取得:上記の文字列を使用して

3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc=

を、私は自分のLinux、Webサーバー上のPHPが解読できることを期待していますそれこのような:

$encrypted = '3WE7cuBFhuLCn3/ZBnUrBn68nn3tVn0NKKz63B3uvoc='; 
$enc = 'aes-256-cbc'; 
$password = 'hello'; 
$key = openssl_decrypt($encrypted, $enc, $password, OPENSSL_ZERO_PADDING); 
echo $key .' should equal this-1234-is-4567-my-8910-secret'; 

しかし、代わりに私はこれを取得:

9(この1234は-4567-my-8910-secretと等しくなるはずです)

I 「以下のサイトを審査し、複数のバージョンを試してみましたましたが、私はそれを正しく復号化するために取得することはできません。

Open SSL Enc
Open SSL Command Line
PHP Decrypt

+0

ない重複。問題は、コマンドライン(ウィンドウ)から暗号化し、phpを使って解読しようとすることです。推奨される解決策はすべてPHP内ですべて暗号化と解読を行うことです。 – Marc

+0

PHPコードでopensslの出力をbase64でデコードしていますか? –

+0

ゼロ埋め込みはあまり考えられません。一般に、PKCS#7(néePKCS#5)のパディングが使用されます。ゼロパディングでは、バイナリデータを暗号化することができません。このバイナリデータはゼロ(0x00)バイトで終了します。 – zaph

答えて

1

AESが動作するようにキー必要です。これは正確に正確な長さのバイトシーケンスです(AES-256の場合は32)。 パスワードを直接使用することはできません(パスワードを構成するバイトが正しい長さにならない限り)。

また、CBC modeは、初期化ベクトル(IV)が16バイト必要です。

OpenSSL encコマンドは、内部機能EVP_BytesToKeyを使用して提供されたパスワードから使用するキーとIVを取得します。 encで暗号化されたファイルを復号化するには、この機能を再現する必要があります。アルゴリズムの詳細はドキュメントにあります。 PHPで、それは次のようになります。

$password = 'hello'; 

$bytes = ""; 
$last = ""; 

// 32 bytes key + 16 bytes IV = 48 bytes. 
while(strlen($bytes) < 48) { 
    $last = md5($last . $password, true); 
    $bytes.= $last; 
} 

// First 32 bytes are the key, next 16 are the IV. 
$key = substr($bytes, 0, 32); 
$iv = substr($bytes, 32, 16); 

をあなたはその後、openssl_decryptコマンドでこれらの値を使用することができます。

$enc = 'aes-256-cbc'; 
$result = openssl_decrypt($encrypted, $enc, $key, OPENSSL_ZERO_PADDING, $iv); 
関連する問題