无法在Ruby中创建(AS3)兼容的河豚字符串

我正在使用Ruby来尝试加密一个字符串,该字符串将存储在数据库中并由Flash / Actionscript应用程序读取/解密。

该应用程序使用此blowfish实现 。

我尝试了openssl和crypt / 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) => # irb(main):010:0> cipher.key = Digest::SHA256.digest(key) => ",&\xB4kh\xFF\xC6\x8F\xF9\x9BE enc = cipher.update(plain) < "m 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); } 

问题是您尝试的两种方式都使用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解码以获得原始字节,从而有效地将已经很差的熵再次减少3/4倍。

Ruby OpenSSL的Blowfish实现需要16个字节的密钥,因此用较短的密钥重现结果是不会幸运的。 我建议你做以下事情:

使用AES而不是Blowfish。 虽然Blowfish从未被“破坏”,但其有效的56位安全性可能是强制性的。

不要使用密码作为密钥。 使用加密安全随机字节。 例如,在Ruby中执行此操作的简单方法是:

  key = cipher.random_key 

你可能想在AS3中找到类似的东西。

不要使用ECB模式。 使用CBC模式,或者,如果您的OpenSSL版本(要求> = 1.0.0)可用,甚至更好,请使用CTR模式。

您可能希望查看Cipher文档 ,以获得有关实现可能被视为安全的内容的更多建议。