Я пытался использовать технику 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.
Спасибо.