2017-02-14 10 views
3

OpenSSL CLIでは、暗号化メソッドで必要とされる長さに適合する限り、ASCII文字列を使用して値を暗号化できます。私はopensslコマンドからのbase64を取るときruby​​ create既存のキー文字列からの暗号キー

require 'openssl' 

cipher = OpenSSL::Cipher::Cipher.new 'AES-256-CBC' 
cipher.encrypt 
cipher.key = "2317823178123897237891232345345234524523452345" 
cipher.iv = "123789123789123789" 
encrypted = cipher.update "flipflop" + cipher.final 
puts encrypted 

cipher = OpenSSL::Cipher::Cipher.new 'AES-256-CBC' 
cipher.decrypt 
cipher.key = "2317823178123897237891232345345234524523452345" 
cipher.iv = "123789123789123789" 
plain = cipher.update(encrypted) + cipher.final 
puts plain 

���ISq��Ҷ0�e� 
crypt.rb:14:in `final': bad decrypt (OpenSSL::Cipher::CipherError) 
    from crypt.rb:14:in `<main>' 

はまた、私は悪い同じ取得:しかし、私はそのキーを取ると、私たちはルビーでこれを通じて実行する場合

printf 'flipflop' | openssl enc -K 2317823178123897237891232345345234524523452345 -iv 123789123789123789 -base64 -aes-256-cbc 

Pd4+UEBW1RyTjARy1rpndQ== 

printf 'Pd4+UEBW1RyTjARy1rpndQ==\n' | openssl enc -d -K 2317823178123897237891232345345234524523452345 -iv 123789123789123789 -base64 -aes-256-cbc 

flipflop 

:たとえば

復号化:

require 'openssl' 
require 'base64' 

clear = Base64.decode64("Pd4+UEBW1RyTjARy1rpndQ==") 

cipher = OpenSSL::Cipher::Cipher.new 'AES-256-CBC' 
cipher.decrypt 
cipher.key = "2317823178123897237891232345345234524523452345" 
cipher.iv = "123789123789123789" 
plain = cipher.update(clear) + cipher.final 
puts plain 

crypt.rb:10:in `final': bad decrypt (OpenSSL::Cipher::CipherError) 
    from crypt.rb:10:in `<main>' 

ここで起こっていることは、OpenSSLが自分のcipを変換していることです彼女のキーとIV一方通行、そしてルビーは別のことをやっている。たとえば、PBKDF2を使用してキーを作成すると、「\ x00 \ AF ...」のような16進数の文字列が得られます。

これは手元にある問題ですか?私は文字列を特定の形式に変換する必要がありますか?それ、どうやったら出来るの?それは問題ではないですか?

+0

はまた、OpenSSLが1.1.0でデフォルトのコマンドライン値を変更することに注意してください。 1.0.2(またはそれ以下)の 'openssl enc'を使用し、1.1.0以上の' openssl dec 'を使用する人々にとってはかなりの量のトラブルを引き起こします。 OpenSSLユーザーリストの[古いopensslファイルの解読](https://mta.openssl.org/pipermail/openssl-users/2017-February/005270.html)も参照してください。 – jww

答えて

3

ここにいくつかの問題があります。

あなたのRuby往復コードがあるため、このラインの加工されていません。

encrypted = cipher.update "flipflop" + cipher.final 

それは次のようになります。

encrypted = cipher.update("flipflop") + cipher.final 

これはbad decryptエラーが生じ、間違った暗号化を与えています。それ以外の場合は、コマンドラインバージョンとは異なるキーとivを使用していますが、そのコードは機能するはずです。ただし、古いバージョンのRubyとOpenSSLバインディングでのみ動作します。 RubyのOpenSSLライブラリの現在のバージョンでは、提供されたkeyivの長さがチェックされ、間違っていると例外が発生します。 aes-256-cbcでは、それぞれ32バイトと16バイトでなければなりません。

openssl encコマンドの-Kおよび-ivオプションは、16進数でエンコードされた文字列を受け取り、生のバイトにデコードします。また、これらの値は、正しい長さになるまで0バイトでパディングされます。ここで

あなたはRubyでコマンドライン暗号化された文字列を復号化することができる方法は次のとおりです。

# Base64 cipher text from the question: 
message = "Pd4+UEBW1RyTjARy1rpndQ==" 
message = Base64.decode64(message) 

key = "2317823178123897237891232345345234524523452345" 
#Convert from hex to raw bytes: 
key = [key].pack('H*') 
#Pad with zero bytes to correct length: 
key << ("\x00" * (32 - key.length)) 

iv ="123789123789123789" 
#Convert from hex to raw bytes: 
iv = [iv].pack('H*') 
#Pad with zero bytes to correct length: 
iv << ("\x00" * (16 - iv.length)) 

cipher = OpenSSL::Cipher.new('AES-256-CBC') 
cipher.decrypt 
cipher.key = key 
cipher.iv = iv 
plain = cipher.update(message) + cipher.final 
puts plain # => 'flipflop' 
+0

美しい、私はこれを一瞬で試してみます。情報マットありがとう。 – Breedly

関連する問題