1

Ruby を使用して、データベースに保存され、Flash/Actionscript アプリによって読み取り/復号化される文字列を暗号化しようとしています。

アプリは、このフグの実装を使用します。

互換性のある文字列を作成するために、 opensslcrypt/blowfishの両方の方法を試しました。どちらも互いに一致せず、Flash アプリが期待するものとも一致しません。

これを機能させるには、どこから始めればよいですか?

irb(main):001:0> require 'openssl'
=> true
irb(main):002:0> require 'crypt/blowfish'
=> true
irb(main):007:0> require 'base64'
=> true
irb(main):003:0> key = "foo"
=> "foo"
irb(main):004:0> plain = "some string" 
=> "some string"
irb(main):005:0> blowfish = Crypt::Blowfish.new(key)
=> 
irb(main):006:0> enc = blowfish.encrypt_block(plain)
=> "\xF5\xAFB\x12=\xB9\xDB\f"
irb(main):008:0> Base64.encode64(enc)
=> "9a9CEj252ww=\n"

# Now, openssl version

irb(main):009:0> cipher = OpenSSL::Cipher::Cipher.new('bf-cbc').send(:encrypt)
=> #<OpenSSL::Cipher::Cipher:0x00000000f26430>
irb(main):010:0> cipher.key = Digest::SHA256.digest(key)
=> ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE<\x1D0A4\x13B-pd\x83\xBF\xA0\xF9\x8A^\x88bf\xE7\xAE"
irb(main):011:0> enc = cipher.update(plain) << cipher.final
=> "m<\xDB\xC1B\x02p\xB0\xD6\xD0\xA4\xE8XyY\x99"
irb(main):012:0> Base64.encode64(enc)
=> "bTzbwUICcLDW0KToWHlZmQ==\n"

編集

AS3 で行っていることは次のとおりです (上記のフグ コードを使用)。

import com.lassieadventurestudio.Blowfish;
import fl.controls.Button;
import fl.controls.TextInput;
import flash.events.MouseEvent;

var $key:String = "foo";

BTN_Submit.label = "Encrypt";
BTN_Submit.addEventListener(MouseEvent.CLICK, onSubmit);

function onSubmit(event:MouseEvent):void
{
        trace("INP_Pass.text, ", INP_Pass.text);

        var $encryption:String = Blowfish.encrypt(INP_Pass.text, $key);
        TXT_Output.text = $encryption;
}

BTN_Decrypt.label = "Decrypt";
BTN_Decrypt.addEventListener(MouseEvent.CLICK, decrypt);

function decrypt(event:MouseEvent):void
{
        TXT_Output2.text = Blowfish.decrypt(TXT_Output.text, $key);

}
4

1 に答える 1

1

問題は、試した両方の方法で CBC モードを使用していることですが、リンクした AS3 の例では ECB モードを使用していることです。

これを使用して同じことを達成できます:

cipher = OpenSSL::Cipher.new('bf-ecb')
cipher.encrypt
cipher.key = key
enc = cipher.update(plain) << cipher.final

ただし、いくつかの理由 (ECB、Blowfish キーの長さ、キーとして直接使用されるパスワードなど) から、これは適切な暗号化スキームではありません。熱心な人には邪魔になりません。

編集:

AS3 の実装を調べましたが、残念ながらそこに示されている結果の例を再現できませんでした。しかし、ブログの Blowfish の実装が悪いと確信しています。使用しないでください。そこで彼らはキーに平易なパスワードを使用し、さらに悪いことに、最初にそれらを Base64 デコードして raw バイトを取得し、それによってすでに悪いエントロピーを再び 3/4 の係数で効果的に減少させます。

Ruby OpenSSL の Blowfish 実装は 16 バイトのキーを使用するため、短いキーで結果を再現することはできません。次のことを行うことをお勧めします。

Blowfish の代わりに AES を使用します。Blowfish は「破られた」ことはありませんが、その 56 ビットの効果的なセキュリティは力ずくで攻撃される可能性があります。

パスワードをキーとして使用しないでください。暗号的に安全なランダム バイトを使用します。たとえば、Ruby でこれを行う簡単な方法は次のとおりです。

 key = cipher.random_key

AS3 で同様のものを見つけたいと思うかもしれません。

ECB モードを使用しないでください。CBC モードを使用するか、お使いの OpenSSL バージョン (>=1.0.0 が必要) で利用可能な場合は、CTR モードを使用してください。

安全と見なされるものを達成するためのアドバイスについては、Cipher のドキュメントを参照してください。

于 2012-07-24T12:37:03.993 に答える