2012-03-17 3 views
2

PHPからFlashへのテキストの暗号化/復号化にBlowfish(CBC)技術を使用しようとしました。 数時間の調査と研究の後、私はAS3CryptoがBlowfish(CBCモード)の解読に使用できることを知りました。簡単な例で は、私はテキストを暗号化するためのMcrypt(PHP用ライブラリ)を使用しています:Blowfish decryption/Action Script 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を使用してそれを符号化することにより、出力を転送することができます。 私たちは「stackoverflowの」と「123456」などのキー(引用なし)として、元のテキストを持っているのであれば、たとえば、出力は(base64で)次のようになります。

MUXl8mBS9OsvxTbLAiCrAMp851L8vVD0

今は問題ありませんティル。 このエンコードされたテキストをフラッシュすると、問題なく取得できます。 http://crypto.hurlant.com/demo/CryptoDemo.swfに行き、「秘密鍵」タブを選択し、暗号化を「Blowfish」、モードを「CBC」、パディングを「なし」、「IVを暗号文に追加する」オプションを選択してください。その後、キーを使用して上のテキストを正常に復号化し、「stackoverflow」テキストを再度取得することができます。

これまで、私はMcryptからAS3Cryptに変換することができることを知っていて、AS3Cryptoライブラリをフラッシュで使用しようとしました(http://code.google.com/p/as3crypto/から入手できます)。

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))); 

} 

} 
} 

は、私は(私が理由の主な問題のそれを解読する方法を見つけ出すことができませんでした)暗号化は同じになりかどうかをテストするには、以下の内容を持つ新しいActionScriptファイルを作りました

そして私は結果を出すために、次のコードを使用しました:

import BlowFish; 
var $key:String = "123456"; 
var $encryption:String = BlowFish.encrypt("stackoverflow", $key); 

trace($encryption); 

は、問題は、私は次の出力を一緒に一致しない可能性があることです。 私はactionscriptについて考えていないので、明らかに間違いがたくさんあります。

AS3Cryptoを使用してフラッシュで暗号化されたテキストを正常に復号化する方法を理解するための例については、

ありがとうございます。

+0

あなたはすべてのバイナリデータだけでなく、プレーンテキストでなく、キーをエンコードする必要があります。キーは、ブタの互換性のあるサイズのオクテット文字列でなければならず、可変長の一般的なテキスト文字列ではなく、エンコードが分からないものでなければなりません。 –

+0

プレーンテキストを1回使用し、他の16進数を使用しているようです。 –

+0

@owlstead問題のPHP側でこれまでのところ問題はありません。その場合、出力をbase64として取得するだけです。このbase64エンコードされたテキストをFlashでデコードするにはどうすればよいですか? – Divisible

答えて

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; 
} 
関連する問題