FlexStringObfuscator - Flame-преобразования во Flex.
To view this page ensure that Adobe Flash Player version 11.1.0 or greater is installed.
По мотивам моей заметки Криптография во Flex и моих веб-сервисов Веб-сервисы компании FlySeason я написал этот онлайновый OpenSource-инструмент для криптографических (и других) преобразований - на основе библиотеки Flame.
Этот инструмент может применяться для онлайновых обфускаций кода. В отличие от самого первого моего инструмента в этом Freeware-разделе, опубликованного ровно для тех же целей (NetStringObfuscatorHelper) - флексовый инструмент существенно удобнее. Он не требует установки и работает как web-приложение.
В моем инструменте задействован лишь один криптографический алгоритм (AES) из большого набора криптографических преобразований, поддерживаемых Flame. Опираясь на мой OpenSource-код вы легко сможете добавить нужные вам функции.
Код этого инструмента перед вами:
1: <?xml version="1.0" encoding="utf-8"?>
2: <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
3: xmlns:s="library://ns.adobe.com/flex/spark"
4: xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="700" minHeight="550" height="550" width="700">
5: <fx:Script>
6: <![CDATA[
7: import flame.crypto.AES;
8: import flame.crypto.ICryptoTransform;
9: import flame.crypto.PaddingMode;
10: import flame.crypto.RSA;
11: import flame.crypto.RSAParameters;
12: import flame.crypto.Rijndael;
13: import flame.utils.ByteArrayUtil;
14: import flame.utils.Convert;
15:
16: import mx.collections.ArrayCollection;
17: import mx.controls.Alert;
18: import mx.events.FlexEvent;
19: import mx.rpc.events.FaultEvent;
20: import mx.rpc.events.ResultEvent;
21: import mx.utils.UIDUtil;
22:
23: import spark.events.IndexChangeEvent;
24: import spark.events.TextOperationEvent;
25:
26: protected var Aes:flame.crypto.AES;
27: protected var Md5:flame.crypto.HashAlgorithm;
28: protected var OperList:ArrayCollection = new ArrayCollection([{t:"MD5"}, {t:"ToBase64"}, {t:"FromBase64"},{t:"ToHex"}, {t:"FromHex"},{t:"AES crypt"}, {t:"AES decrypt"}]);
29: protected var FromArr:ByteArray;
30: protected var ToArr:ByteArray;
31:
32:
33: protected function NewAesGO(event:MouseEvent):void
34: {
35: Aes = new flame.crypto.AES();
36: Aes.padding=flame.crypto.PaddingMode.PKCS7;
37: Aes.keySize=128;
38: Aes.blockSize=128;
39: AESKey.text = flame.utils.ByteArrayUtil.toHexString(Aes.key);
40: AESIV.text = flame.utils.ByteArrayUtil.toHexString(Aes.iv);
41: }
42:
43: protected function OperGO(e):void
44: {
45: if (Oper.selectedItem==null){
46: Oper.selectedIndex=0;
47: }
48: try{
49: switch (Oper.selectedItem.t){
50: case "MD5" :
51: FromArr=new ByteArray();
52: Md5= new flame.crypto.MD5();
53: FromArr.writeUTFBytes(FromText.text);
54: Md5.computeHash(FromArr);
55: ToText.text = flame.utils.ByteArrayUtil.toHexString(Md5.hash);
56: break;
57: case "ToBase64" :
58: FromArr=new ByteArray();
59: FromArr.writeUTFBytes(FromText.text);
60: ToText.text=flame.utils.Convert.toBase64String(FromArr);
61: break;
62: case "FromBase64" :
63: FromArr=new ByteArray();
64: FromArr=flame.utils.Convert.fromBase64String(FromText.text);
65: ToText.text=FromArr.readUTFBytes(FromArr.length);
66: break;
67: case "ToHex" :
68: FromArr=new ByteArray();
69: FromArr.writeUTFBytes(FromText.text);
70: ToText.text=flame.utils.ByteArrayUtil.toHexString(FromArr);
71: break;
72: case "FromHex" :
73: FromArr=new ByteArray();
74: FromArr=flame.utils.ByteArrayUtil.fromHexString(FromText.text);
75: ToText.text=FromArr.readUTFBytes(FromArr.length);
76: break;
77: case "AES crypt" :
78: if (Aes==null){
79: Aes = new flame.crypto.AES();
80: Aes.padding=flame.crypto.PaddingMode.PKCS7;
81: Aes.keySize=128;
82: Aes.blockSize=128;
83: }
84: Aes.key=flame.utils.ByteArrayUtil.fromHexString(AESKey.text);
85: Aes.iv=flame.utils.ByteArrayUtil.fromHexString(AESIV.text);
86: FromArr=new ByteArray();
87: FromArr.writeUTFBytes(FromText.text);
88: var CryptoTransform:flame.crypto.ICryptoTransform = Aes.createEncryptor(Aes.key,Aes.iv);
89: ToArr=new ByteArray();
90: ToArr=CryptoTransform.transformFinalBlock(FromArr,0,FromArr.length);
91: ToText.text=flame.utils.ByteArrayUtil.toHexString(ToArr);
92: break;
93: case "AES decrypt" :
94: if (Aes==null){
95: Aes = new flame.crypto.AES();
96: Aes.padding=flame.crypto.PaddingMode.PKCS7;
97: Aes.keySize=128;
98: Aes.blockSize=128;
99: }
100: Aes.key=flame.utils.ByteArrayUtil.fromHexString(AESKey.text);
101: Aes.iv=flame.utils.ByteArrayUtil.fromHexString(AESIV.text);
102: FromArr=new ByteArray();
103: FromArr=flame.utils.ByteArrayUtil.fromHexString(FromText.text);
104: var CryptoTransform:flame.crypto.ICryptoTransform = Aes.createDecryptor(Aes.key,Aes.iv);
105: ToArr=new ByteArray();
106: ToArr=CryptoTransform.transformFinalBlock(FromArr,0,FromArr.length);
107: ToText.text=ToArr.readUTFBytes(ToArr.length);
108: break;
109: }
110: }
111: catch (ex:Error){
112: Alert.show(ex.message);
113: }
114: }
115:
116:
117: ]]>
118: </fx:Script>
119:
120: <fx:Declarations>
121:
122: </fx:Declarations>
123:
124: <s:BorderContainer width="100%" height="100%" borderWeight="2" cornerRadius="5" dropShadowVisible="true" y="0">
125: <s:backgroundFill>
126: <s:LinearGradient rotation="90">
127: <s:GradientEntry color="0xF4F4F4" />
128: <s:GradientEntry color="0xB9B9B9" />
129: </s:LinearGradient>
130: </s:backgroundFill>
131: </s:BorderContainer>
132: <mx:Form x="20" y="20">
133: <mx:FormItem label="AES" height="20">
134: <s:HGroup width="490" height="20">
135: <s:Button label="New" click="NewAesGO(event)" id="NewAes" width="50" />
136: <s:Label text=" (PaddingMode.PKCS7, keySize=128, blockSize=128)" width="430" height="20" paddingTop="5"/>
137: </s:HGroup>
138: </mx:FormItem>
139: <mx:FormItem label="Key:">
140: <s:TextArea id="AESKey" width="500" height="20" text="сюда введите или сгенерируйте Ключ для AES" fontFamily="Courier New"/>
141: </mx:FormItem>
142: <mx:FormItem label="IV :" >
143: <s:TextArea id="AESIV" width="500" height="20" text="сюда введите или сгенерируйте IV для AES" fontFamily="Courier New"/>
144: <mx:VRule height="30" visible="false"/>
145: </mx:FormItem>
146: <mx:FormItem label="From:">
147: <s:TextArea id="FromText" width="500" height="150" text="сюда введите исходный текст и выберите преобразование" fontFamily="Courier New" change="OperGO(event)"/>
148: <mx:VRule height="10" visible="false"/>
149: </mx:FormItem>
150: <mx:FormItem label="Convert">
151: <s:HGroup width="490" height="20">
152: <s:DropDownList id="Oper" width="250" dataProvider="{OperList}" change="OperGO(event)" labelField="t"></s:DropDownList>
153: <s:Label text=" (UTF8)" width="430" height="20" paddingTop="5"/>
154: </s:HGroup>
155: <mx:VRule height="10" visible="false"/>
156: </mx:FormItem>
157: <mx:FormItem label="To:">
158: <s:TextArea id="ToText" width="500" height="150" text="здесь будет результат преобразования" fontFamily="Courier New"/>
159: </mx:FormItem>
160: </mx:Form>
161: </s:Application>
Обратите внимание, насколько недопустимо хранение чуствительных данных в коде в открытом виде - мне потребовалось не более 10 кликов мышкой - чтобы увидеть пароли шифрования в SWF-файле, прошитые туда без обфускации:
<SITEMAP> <MVC> <ASP> <NET> <DATA> <KIOSK> <FLEX> <SQL> <NOTES> <LINUX> <MONO> <FREEWARE> <DOCS> <ENG> <CHAT ME> <ABOUT ME> < THANKS ME> |