文字列復号化のためのOpenSSL

文字列復号化のためのOpenSSL

これが正しいコミュニティではない場合は謝罪します。

RC2パスワードを使用して暗号化された文字列があります。鍵とIVを知っていますが、OpenSSLを使用して復号化するのに問題があります。私はプレーンテキストが何であるかを知っています。

$ echo MY_CIPHER_TEXT | openssl enc -d -base64 -rc2 -iv MY_IV

復号化パスワードを入力しましたが、常に返信があります

bad magic number

私はこれがopensslがMY_CIPHER_TEXTを暗号化されたテキストとして認識していないことを意味すると思いますが、その理由を理解するのに苦労しています。

「Bad Magic Number」応答を受け取る理由を説明できる人はいますか?

MY_CIPHER_TEXT = nKZQD6RKk9ozeGV5WOMVL9TDZTgg9mOZjDpBDqIocR8OGC+WcB4xAwDx7XTaJNv9v+Y3sEzNphtET6sXxBd0e/0Oh6g2d0LrKls2BFHGbaMynEVW2xy4xLP40se55zdawVLGImSxgiBtf9unfIJYN4EpdPlMiiB2TuvyEoUUtqQ=

MY_VI = jqn76XOl4To=

答え1

単にRC2アルゴリズムを知るだけでは十分ではなく、RC2アルゴリズムも知る必要があります。あなたも一致する必要があります動作モード特定のパターンのパディングスキーム。 OpenSSLコマンドライン(およびほとんどのEVP API)は、デフォルトでCBCモードと「PKCS5」(技術的にはPKCS7)パディングに設定されており、これは正確でもそうでない場合もあります。

openssl enc基本的にパスワードベース暗号化と復号化、つまり物理キーそして4つ(IVなしのECBを除く)パスワードとして使用されるものハッシングプロセスから派生PBKDF(パスワードベースのキー派生関数)と呼ばれ、ユーザーが提供するすべての引数は-iv無視されます。これはとにかく、ユーザーが提供した引数が無効であるため、お勧めします。下記をご覧ください。 OpenSSL PBKDF(他のより良いものと同様に)は、OpenSSL固有の形式で暗号文の先頭に保存する必要がある任意の「salt」を使用します。このsaltがないとエラーメッセージが表示されますbad magic number。詳細については、次を参照してください。https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/35614#35614

キー(パスワードではない)とIVがあるので、両方とも次のように変換してください。16進数(base64ではありません)以下を使用してください。

 openssl enc -base64 -d -rc2[-mode] -K $key_in_hex -iv $iv_in_hex
 # note that's -K uppercase not -k lowercase 
 # you can use -a as a synonym for -base64 
 # For a block mode like CBC if standard PKCS5/7 padding wasn't used
 # add -nopad and handle the last few bytes manually as needed.
 # If your input is more than 76 chars per line (as your Q showed) 
 # and OpenSSL version before 1.1.0 you also need -A (uppercase).

Base64を16進数に変換する方法はいくつかありますが、最も便利な方法は次のとおりです。

 somevar=$( echo some_base64 | openssl base64 -d | xxd -p )
 # xxd -p outputs only the hex with no labels or ASCII etc
 # and thus is suitable as an argument to openssl enc 
 # without any processing by tools like sed, tr, awk 

関連情報