2012-03-17 81 views
2

我曾嘗試使用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成功解密閃存中的加密文本。

謝謝。

+0

您應該編碼所有的二進制數據,而不僅僅是純文本,也是關鍵。密鑰應該是河豚兼容的八位字節串,而不是一些可變長度的通用文本串,其編碼是未知的。 – 2012-03-17 14:49:13

+0

您似乎一次使用純文本而另一次使用十六進制。 – 2012-03-17 14:52:11

+0

@owlstead到目前爲止,問題的PHP方面我沒有問題,在那裏,我只是得到輸出爲base64,所以我怎麼能得到這個base64編碼文本解碼在閃存? – Divisible 2012-03-17 15:00:03

回答

2

希望這是有益的:

public static function encryptString(encString : String = "") : String 
{ 
    var kdata : ByteArray = Hex.toArray(Hex.fromString(k)) 
    var _method : String = "simple-blowfish-ecb"; 
    var pad : IPad  = new NullPad; 
    var crypt : ICipher = Crypto.getCipher(_method, kdata, pad); 
    var data : ByteArray = Hex.toArray(Hex.fromString(encString)); 
    pad.setBlockSize(crypt.getBlockSize()); 
    crypt.encrypt(data); 
    encString = Base64.encodeByteArray(data); 
    return encString; 
}