source: trunk/fl5/src/com/longtailvideo/jwplayer/utils/TEA.as @ 813

Revision 813, 4.9 KB checked in by pablo, 3 years ago (diff)
Line 
1/**
2 * Encrypts and decrypts text with the TEA (Block) algorithm.
3 * @authors Mika Palmu
4 * @version 2.0
5 *
6 * Original Javascript implementation:
7 * Chris Veness, Movable Type Ltd: www.movable-type.co.uk
8 * Algorithm: David Wheeler & Roger Needham, Cambridge University Computer Lab
9 * See http://www.movable-type.co.uk/scripts/TEAblock.html
10 **/
11package com.longtailvideo.jwplayer.utils {
12
13    public class TEA {
14               
15        /** Encrypts a string with the specified key. **/
16        public static function encrypt(src:String, key:String):String {
17            var v:Array = charsToLongs(strToChars(src));
18            var k:Array = charsToLongs(strToChars(key));
19            var n:Number = v.length;
20            var p:Number;
21            if (n == 0)
22                return "";
23            if (n == 1)
24                v[n++] = 0;
25            var z:Number = v[n - 1], y:Number = v[0], delta:Number = 0x9E3779B9;
26            var mx:Number, e:Number, q:Number = Math.floor(6 + 52 / n), sum:Number = 0;
27            while (q-- > 0) {
28                sum += delta;
29                e = sum >>> 2 & 3;
30                for (p = 0; p < n - 1; p++) {
31                    y = v[p + 1];
32                    mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
33                    z = v[p] += mx;
34                }
35                y = v[0];
36                mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
37                z = v[n - 1] += mx;
38            }
39            return charsToHex(longsToChars(v));
40        }
41
42        /** Decrypts a string with the specified key. **/
43        public static function decrypt(src:String, key:String):String {
44            var v:Array = charsToLongs(hexToChars(src));
45            var k:Array = charsToLongs(strToChars(key));
46            var n:Number = v.length;
47            var p:Number;
48            if (n == 0)
49                return "";
50            var z:Number = v[n - 1], y:Number = v[0], delta:Number = 0x9E3779B9;
51            var mx:Number, e:Number, q:Number = Math.floor(6 + 52 / n);
52            var sum:Number = q * delta;
53            while (sum != 0) {
54                e = sum >>> 2 & 3;
55                for (p = n - 1; p > 0; p--) {
56                    z = v[p - 1];
57                    mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
58                    y = v[p] -= mx;
59                }
60                z = v[n - 1];
61                mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
62                y = v[0] -= mx;
63                sum -= delta;
64            }
65            return charsToStr(longsToChars(v));
66        }
67
68        /** Private methods. **/
69        private static function charsToLongs(chars:Array):Array {
70            var temp:Array = new Array(Math.ceil(chars.length / 4));
71            for (var i:Number = 0; i < temp.length; i++) {
72                temp[i] = chars[i * 4] + (chars[i * 4 + 1] << 8) + (chars[i * 4 + 2] << 16) + (chars[i * 4 + 3] << 24);
73            }
74            return temp;
75        }
76
77        private static function longsToChars(longs:Array):Array {
78            var codes:Array = new Array();
79            for (var i:Number = 0; i < longs.length; i++) {
80                codes.push(longs[i] & 0xFF, longs[i] >>> 8 & 0xFF, longs[i] >>> 16 & 0xFF,
81                           longs[i] >>> 24 & 0xFF);
82            }
83            return codes;
84        }
85
86        private static function longToChars(longs:Number):Array {
87            var codes:Array = new Array();
88            codes.push(longs & 0xFF, longs >>> 8 & 0xFF, longs >>> 16 & 0xFF, longs >>> 24 & 0xFF);
89            return codes;
90        }
91
92        private static function charsToHex(chars:Array):String {
93            var result:String = new String("");
94            var hexes:Array = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8",
95                                        "9", "a", "b", "c", "d", "e", "f");
96            for (var i:Number = 0; i < chars.length; i++) {
97                result += hexes[chars[i] >> 4] + hexes[chars[i] & 0xf];
98            }
99            return result;
100        }
101
102        private static function hexToChars(hex:String):Array {
103            var codes:Array = new Array();
104            for (var i:Number = (hex.substr(0, 2) == "0x") ? 2 : 0; i < hex.length; i += 2) {
105                codes.push(parseInt(hex.substr(i, 2), 16));
106            }
107            return codes;
108        }
109
110        private static function charsToStr(chars:Array):String {
111            var result:String = new String("");
112            for (var i:Number = 0; i < chars.length; i++) {
113                result += String.fromCharCode(chars[i]);
114            }
115            return result;
116        }
117
118        private static function strToChars(str:String):Array {
119            var codes:Array = new Array();
120            for (var i:Number = 0; i < str.length; i++) {
121                codes.push(str.charCodeAt(i));
122            }
123            return codes;
124        }
125    }
126}
Note: See TracBrowser for help on using the repository browser.