我曾尝试使用Blowfish(CBC)技术来加密/解密从PHP到Flash的文本。 经过数小时的调查研究,我了解到AS3Crypto可以用于解密Blowfish(CBC模式)。 在一个简单的例子,我使用的这个Mcrypt(PHP的文库)的文本进行加密:Blowfish解密/动作脚本3(AS3Crypto)
const CYPHER = 'blowfish';
const MODE = 'cbc';
const KEY = '12345';
public function encrypt($plaintext)
{
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return $iv.$crypttext;
}
然后,我可以通过使用Base64编码其传送的输出。 因此,例如,如果我们有原来的文本(不带引号),“计算器”,关键是“123456”,输出将是的(Base64):
MUXl8mBS9OsvxTbLAiCrAMp851L8vVD0
到目前为止没有问题。 现在,当我将这个编码文本转换为flash时,我可以毫无问题地得到它。 您可以尝试去http://crypto.hurlant.com/demo/CryptoDemo.swf,然后选择“密钥”选项卡,并选择加密为“Blowfish”,模式为“CBC”,填充为“无”,并勾选“将Prepend IV添加到密文”选项。之后,您可以使用该密钥成功解密上面的文本,并再次获取“stackoverflow”文本。因此,直到现在我知道它可能从Mcrypt转换为AS3Crypt,然后我试图在闪存中使用AS3Crypto库(您可以从:http://code.google.com/p/as3crypto/得到它)。
我做了它具有以下内容来测试加密是否会是一样的(我无法弄清楚如何解密,因为主要的问题),一个新的ActionScript文件:
package
{
import com.hurlant.crypto.Crypto;
import com.hurlant.util.Hex;
import com.hurlant.crypto.hash.HMAC;
import com.hurlant.crypto.hash.IHash;
import com.hurlant.crypto.hash.MD5;
import com.hurlant.crypto.hash.SHA1;
import com.hurlant.crypto.hash.SHA224;
import com.hurlant.crypto.hash.SHA256;
import com.hurlant.crypto.prng.ARC4;
import com.hurlant.crypto.symmetric.AESKey;
import com.hurlant.crypto.symmetric.BlowFishKey;
import com.hurlant.crypto.symmetric.CBCMode;
import com.hurlant.crypto.symmetric.CFB8Mode;
import com.hurlant.crypto.symmetric.CFBMode;
import com.hurlant.crypto.symmetric.CTRMode;
import com.hurlant.crypto.symmetric.DESKey;
import com.hurlant.crypto.symmetric.ECBMode;
import com.hurlant.crypto.symmetric.ICipher;
import com.hurlant.crypto.symmetric.IMode;
import com.hurlant.crypto.symmetric.IPad;
import com.hurlant.crypto.symmetric.ISymmetricKey;
import com.hurlant.crypto.symmetric.IVMode;
import com.hurlant.crypto.symmetric.NullPad;
import com.hurlant.crypto.symmetric.OFBMode;
import com.hurlant.crypto.symmetric.PKCS5;
import com.hurlant.crypto.symmetric.SimpleIVMode;
import com.hurlant.crypto.symmetric.TripleDESKey;
import com.hurlant.crypto.symmetric.XTeaKey;
import flash.utils.ByteArray;
import com.hurlant.crypto.rsa.RSAKey;
import com.hurlant.util.Base64;
public class BlowFish
{
/**
* Encrypts a string.
* @param text The text string to encrypt.
* @param key A cipher key to encrypt the text with.
*/
/**
* Decrypts an encrypted string.
* @param text The text string to decrypt.
* @param key The key used while originally encrypting the text.
*/
static public function encrypt(s :String, k :String) :String
{
var key :ByteArray = Hex.toArray(k);
var data :ByteArray = Hex.toArray(Hex.fromString(s));
var pad :IPad = new NullPad();
var cipher :ICipher = Crypto.getCipher("blowfish-cbc", key, pad);
pad.setBlockSize(cipher.getBlockSize());
cipher.encrypt(data);
var result :String = Hex.fromArray(data);
var ivmode :IVMode = cipher as IVMode;
var iv :String = Hex.fromArray(ivmode.IV);
return Base64.encodeByteArray(Hex.toArray(Hex.fromArray(ivmode.IV) + Hex.fromArray(data)));
}
}
}
而且我用下面的代码来脱身结果:
import BlowFish;
var $key:String = "123456";
var $encryption:String = BlowFish.encrypt("stackoverflow", $key);
trace($encryption);
的问题是,我不能产出如下搭配在一起。 我对动作没有任何意见,所以你很明显会发现很多错误。
我将非常感激任何解释和解决方案,并举例说明如何使用AS3Crypto成功解密闪存中的加密文本。
谢谢。
您应该编码所有的二进制数据,而不仅仅是纯文本,也是关键。密钥应该是河豚兼容的八位字节串,而不是一些可变长度的通用文本串,其编码是未知的。 – 2012-03-17 14:49:13
您似乎一次使用纯文本而另一次使用十六进制。 – 2012-03-17 14:52:11
@owlstead到目前为止,问题的PHP方面我没有问题,在那里,我只是得到输出为base64,所以我怎么能得到这个base64编码文本解码在闪存? – Divisible 2012-03-17 15:00:03