1
11
12 import com.sekati.crypt.ICipher;
13
14
17 class com.sekati.crypt.RC4 implements ICipher {
18
19 private static var sbox:Array = new Array( 255 );
20 private static var mykey:Array = new Array( 255 );
21
22
28 public static function encrypt(src:String, key:String):String {
29 var mtxt:Array = strToChars( src );
30 var mkey:Array = strToChars( key );
31 var result:Array = calculate( mtxt, mkey );
32 return charsToHex( result );
33 }
34
35
41 public static function decrypt(src:String, key:String):String {
42 var mtxt:Array = hexToChars( src );
43 var mkey:Array = strToChars( key );
44 var result:Array = calculate( mtxt, mkey );
45 return charsToStr( result );
46 }
47
48 private static function initialize(pwd:Array):Void {
49 var b:Number = 0;
50 var tempSwap:Number;
51 var intLength:Number = pwd.length;
52 var a:Number;
53 for (a = 0; a <= 255 ; a++) {
54 mykey[a] = pwd[(a % intLength)];
55 sbox[a] = a;
56 }
57 for (a = 0; a <= 255 ; a++) {
58 b = (b + sbox[a] + mykey[a]) % 256;
59 tempSwap = sbox[a];
60 sbox[a] = sbox[b];
61 sbox[b] = tempSwap;
62 }
63 }
64
65 private static function calculate(plaintxt:Array, psw:Array):Array {
66 initialize( psw );
67 var i:Number = 0;
68 var j:Number = 0;
69 var cipher:Array = new Array( );
70 var k:Number, temp:Number, cipherby:Number;
71 for (var a:Number = 0; a < plaintxt.length ; a++) {
72 i = (i + 1) % 256;
73 j = (j + sbox[i]) % 256;
74 temp = sbox[i];
75 sbox[i] = sbox[j];
76 sbox[j] = temp;
77 var idx:Number = (sbox[i] + sbox[j]) % 256;
78 k = sbox[idx];
79 cipherby = plaintxt[a] ^ k;
80 cipher.push( cipherby );
81 }
82 return cipher;
83 }
84
85 private static function charsToHex(chars:Array):String {
86 var result:String = new String( "" );
87 var hexes:Array = new Array( "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" );
88 for (var i:Number = 0; i < chars.length ; i++) {
89 result += hexes[chars[i] >> 4] + hexes[chars[i] & 0xf];
90 }
91 return result;
92 }
93
94 private static function hexToChars(hex:String):Array {
95 var codes:Array = new Array( );
96 for (var i:Number = (hex.substr( 0, 2 ) == "0x") ? 2 : 0; i < hex.length ; i += 2) {
97 codes.push( parseInt( hex.substr( i, 2 ), 16 ) );
98 }
99 return codes;
100 }
101
102 private static function charsToStr(chars:Array):String {
103 var result:String = new String( "" );
104 for (var i:Number = 0; i < chars.length ; i++) {
105 result += String.fromCharCode( chars[i] );
106 }
107 return result;
108 }
109
110 private static function strToChars(str:String):Array {
111 var codes:Array = new Array( );
112 for (var i:Number = 0; i < str.length ; i++) {
113 codes.push( str.charCodeAt( i ) );
114 }
115 return codes;
116 }
117
118 private function RC4() {
119 }
120 }