Расшифровка Blowfish / Action Script 3 (AS3Crypto) - PullRequest
2 голосов
/ 17 марта 2012

Я пытался использовать технику Blowfish (CBC) для шифрования / дешифрования текста из PHP во Flash. После нескольких часов исследований и исследований я узнал, что AS3Crypto можно использовать для расшифровки Blowfish (режим CBC). В простом примере я использую Mcrypt (Библиотека для PHP) для шифрования текста:

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», «Padding» как «none» и установить флажок «Prepend IV to шифровать текст». , После этого вы можете успешно расшифровать текст выше, используя ключ, и снова получить текст «stackoverflow».

Итак, до сих пор я знаю, что его можно конвертировать из Mcrypt в AS3Crypt, а затем я попытался использовать библиотеку AS3Crypto во флэш-памяти (вы можете получить ее по адресу: http://code.google.com/p/as3crypto/).

Я создал новый файл actioncript, который имеет следующее содержание, чтобы проверить, будут ли шифрования одинаковыми (я не мог понять, как расшифровать его из-за основной проблемы):

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

Проблема в том, что я не могу сопоставить следующие выходные данные вместе. Я не имею никакого представления о ActionScript, поэтому вы, очевидно, найдете в нем много ошибок.

Я буду очень признателен за любое объяснение и решение с примером, чтобы выяснить, как успешно расшифровать зашифрованный текст во флэш-памяти с помощью AS3Crypto.

Спасибо.

1 Ответ

2 голосов
/ 11 мая 2012

надеюсь, что это полезно:

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;
}
...