| 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 | **/ |
|---|
| 11 | package 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 | } |
|---|