2017-12-12 10 views
1

この質問はパート2としてmy previous questionに役立ちます。
私は同様の質問をしている他のスレッドに出くわしましたが、PHPの最近の変更(つまり、mcryptの削除)のために、私は2017/18でOpenSSLを使ってこれをどうやって行うのが最適かを考えています。端末でのPHP生成OpenSSL文字列の解読

私は、PHPスクリプトで以下の機能を考案しました。プレーンテキスト文字列を受け取り、暗号化します。

<?php 
function encrypt($myString) { 
    $data = $myString; 
    $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF'; 
    $iv = '61736466673534336173646667353433'; 

    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, hex2bin($iv)); 
    return $encrypted; 
} 
?> 

戻り値:6Q7DM7VGEeJdnGf2h9k1Kgの==

私の質問は非常に簡単です:そのプレーンテキストに戻す上記の結果を回しターミナル解読同等とは何ですか?

は、これまでのところ私は(速く変数の操作のために)AppleScriptの中で次のターミナルコマンドを使用することができましたが、do shell script内容はターミナルコードです:

set encKey to "B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF" 
set encIV to "61736466673534336173646667353433" 
set stringToEnc to "my plain text string" 

set encrypted to (do shell script "echo '" & stringToEnc & "' | openssl enc -aes-256-cbc -a -K " & encKey & " -iv " & encIV) 
set decrypted to (do shell script "echo '" & encrypted & "' | openssl enc -aes-256-cbc -a -d -K " & encKey & " -iv " & encIV) 

しかし、これは中(encryptedを設定し、そのまま働きながら、 PHP関数の出力に上記のスクリプトが)、それはエラーがスローされます。

bad decrypt 140735624655752:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/evp/evp_enc.c:529:

thisthatここSO上で同様の質問を勉強したので、私は困惑していWH yエラーは発生し続けます。 keyiv(私はhex2bin()をPHPで使用しました)のエンコーディングが原因であると考えています。使用しないと別の結果が得られます。

ターミナルコマンドには何が欠けていますか?誰かが私に相当する解読を手助けできるなら、私は本当に助けに感謝します。

答えて

1

あなたの最後の質問のように、あなたは少しエンコーディングに苦労しています。 openssl_encryptのドキュメントを慎重に参照すると、キーとIVの両方を16進ではなく生の値として渡す必要があることに注意してください。

このコードでは、キーではなくIVで正しく行いました。このキーを16進値として渡しました。つまり、必要なキーの2倍の長さです。合計512ビットの鍵素材を渡したので、最初の256ビットの鍵(この場合はB374A26A71490437AA024E4FADD5B497)が使用されます。

ASCIIコード化された生の鍵は、正確には256ビットのB374A26A71490437AA024E4FADD5B497です。しかし、私が最初の質問で議論したOpenSSL -Kフラグは、キーが16進数でエンコードされている必要があります。つまり、キーを16進数でエンコードする必要があります。したがって、実際に16進数でエンコードされた暗号化キーである4233373441323641373134393034333741413032344534464144443542343937を取得するには、B374A26A71490437AA024E4FADD5B497を16進数でエンコードします。

ので、要約すると、最後のコマンドは、私が正しいと仮定ちょうどバイト0x70の出力を与えるこの、次のとおりです。

openssl enc -d -K 4233373441323641373134393034333741413032344534464144443542343937 -iv 61736466673534336173646667353433 -in input.bin -out out.bin 

これはinput.binがBase64ではバイナリをデコードしていることを前提としていあなたが提供したbase64暗号文。

関連する問題