PageRenderTime 349ms CodeModel.GetById 80ms app.highlight 168ms RepoModel.GetById 93ms app.codeStats 1ms

/js/lib/Socket.IO-node/support/socket.io-client/lib/vendor/web-socket-js/flash-src/com/hurlant/crypto/symmetric/DESKey.as

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs
ActionScript | 365 lines | 277 code | 53 blank | 35 comment | 17 complexity | 20fcbad156109400920285df56cadfbc MD5 | raw file
  1/**
  2 * DESKey
  3 * 
  4 * An Actionscript 3 implementation of the Data Encryption Standard (DES)
  5 * Copyright (c) 2007 Henri Torgemane
  6 * 
  7 * Derived from:
  8 * 		The Bouncy Castle Crypto package, 
  9 * 		Copyright (c) 2000-2004 The Legion Of The Bouncy Castle
 10 * 		(http://www.bouncycastle.org)
 11 * 
 12 * See LICENSE.txt for full license information.
 13 */
 14package com.hurlant.crypto.symmetric
 15{
 16	import flash.utils.ByteArray;
 17	import com.hurlant.util.Hex;
 18	import com.hurlant.util.Memory;
 19
 20	public class DESKey implements ISymmetricKey
 21	{
 22		/**
 23		 * what follows is mainly taken from "Applied Cryptography", by Bruce
 24		 * Schneier, however it also bears great resemblance to Richard
 25		 * Outerbridge's D3DES...
 26		 */
 27	
 28		private static const Df_Key:Array = [ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32,
 29				0x10, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 ];
 30	
 31		private static const bytebit:Array = [ 128, 64, 32, 16, 8, 4, 2, 1 ];
 32	
 33		private static const bigbyte:Array = [ 0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 0x8000,
 34				0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 ];
 35	
 36		/*
 37		 * Use the key schedule specified in the Standard (ANSI X3.92-1981).
 38		 */
 39	
 40		private static const pc1:Array = [ 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2,
 41				59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12,
 42				4, 27, 19, 11, 3 ];
 43	
 44		private static const totrot:Array = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 ];
 45	
 46		private static const pc2:Array = [ 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40,
 47				51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 ];
 48	
 49		private static const SP1:Array = [ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004,
 50				0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
 51				0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004,
 52				0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404,
 53				0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400,
 54				0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404,
 55				0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004,
 56				0x00010400, 0x00000000, 0x01010004 ];
 57	
 58		private static const SP2:Array = [ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020,
 59				0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
 60				0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020,
 61				0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020,
 62				0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020,
 63				0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020,
 64				0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000,
 65				0x80100020, 0x80108020, 0x00108000 ];
 66	
 67		private static const SP3:Array = [ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208,
 68				0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
 69				0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208,
 70				0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000,
 71				0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208,
 72				0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208,
 73				0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208,
 74				0x00000008, 0x08020008, 0x00020200 ];
 75	
 76		private static const SP4:Array = [ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001,
 77				0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
 78				0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081,
 79				0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001,
 80				0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081,
 81				0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000,
 82				0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080,
 83				0x00800000, 0x00002000, 0x00802080 ];
 84	
 85		private static const SP5:Array = [ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000,
 86				0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
 87				0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000,
 88				0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100,
 89				0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000,
 90				0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100,
 91				0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000,
 92				0x40080000, 0x02080100, 0x40000100 ];
 93	
 94		private static const SP6:Array = [ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010,
 95				0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
 96				0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010,
 97				0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010,
 98				0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000,
 99				0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010,
100				0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000,
101				0x20000000, 0x00400010, 0x20004010 ];
102	
103		private static const SP7:Array = [ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802,
104				0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
105				0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000,
106				0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800,
107				0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800,
108				0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000,
109				0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002,
110				0x04000800, 0x00000800, 0x00200002 ];
111	
112		private static const SP8:Array = [ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040,
113				0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
114				0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040,
115				0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000,
116				0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040,
117				0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040,
118				0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040,
119				0x00040040, 0x10000000, 0x10041000 ];
120
121	
122		protected var key:ByteArray;
123		protected var encKey:Array;
124		protected var decKey:Array;
125	
126
127		public function DESKey(key:ByteArray) {
128			this.key = key;
129			this.encKey = generateWorkingKey(true, key, 0);
130			this.decKey = generateWorkingKey(false, key, 0);
131		}
132
133		public function getBlockSize():uint
134		{
135			return 8;
136		}
137		
138		public function decrypt(block:ByteArray, index:uint=0):void
139		{
140			desFunc(decKey, block, index, block, index);
141		}
142		
143		public function dispose():void
144		{
145			var i:uint=0;
146			for (i=0;i<encKey.length;i++) { encKey[i]=0; }
147			for (i=0;i<decKey.length;i++) { decKey[i]=0; }
148			encKey=null;
149			decKey=null;
150			for (i=0;i<key.length;i++) { key[i]=0; }
151			key.length = 0;
152			key = null;
153			Memory.gc();
154		}
155		
156		public function encrypt(block:ByteArray, index:uint=0):void
157		{
158			desFunc(encKey, block, index, block, index);
159		}
160			
161	
162		/**
163		 * generate an integer based working key based on our secret key and what we
164		 * processing we are planning to do.
165		 * 
166		 * Acknowledgements for this routine go to James Gillogly & Phil Karn.
167		 */
168		protected function generateWorkingKey(encrypting:Boolean, key:ByteArray, off:uint):Array
169		{
170			//int[] newKey = new int[32];
171			var newKey:Array = [];
172			//boolean[] pc1m = new boolean[56], pcr = new boolean[56];
173			var pc1m:ByteArray = new ByteArray;
174			var pcr:ByteArray = new ByteArray;
175			
176			var l:uint;
177	
178			for (var j:uint = 0; j < 56; j++)
179			{
180				l = pc1[j];
181	
182				pc1m[j] = ((key[off + (l >>> 3)] & bytebit[l & 07]) != 0);
183			}
184	
185			for (var i:uint = 0; i < 16; i++)
186			{
187				var m:uint;
188				var n:uint;
189	
190				if (encrypting)
191				{
192					m = i << 1;
193				}
194				else
195				{
196					m = (15 - i) << 1;
197				}
198	
199				n = m + 1;
200				newKey[m] = newKey[n] = 0;
201	
202				for (j = 0; j < 28; j++)
203				{
204					l = j + totrot[i];
205					if (l < 28)
206					{
207						pcr[j] = pc1m[l];
208					}
209					else
210					{
211						pcr[j] = pc1m[l - 28];
212					}
213				}
214	
215				for (j = 28; j < 56; j++)
216				{
217					l = j + totrot[i];
218					if (l < 56)
219					{
220						pcr[j] = pc1m[l];
221					}
222					else
223					{
224						pcr[j] = pc1m[l - 28];
225					}
226				}
227	
228				for (j = 0; j < 24; j++)
229				{
230					if (pcr[pc2[j]])
231					{
232						newKey[m] |= bigbyte[j];
233					}
234	
235					if (pcr[pc2[j + 24]])
236					{
237						newKey[n] |= bigbyte[j];
238					}
239				}
240			}
241	
242			//
243			// store the processed key
244			//
245			for (i = 0; i != 32; i += 2)
246			{
247				var i1:uint;
248				var i2:uint;
249	
250				i1 = newKey[i];
251				i2 = newKey[i + 1];
252	
253				newKey[i] = ((i1 & 0x00fc0000) << 6) | ((i1 & 0x00000fc0) << 10) | ((i2 & 0x00fc0000) >>> 10)
254						| ((i2 & 0x00000fc0) >>> 6);
255	
256				newKey[i + 1] = ((i1 & 0x0003f000) << 12) | ((i1 & 0x0000003f) << 16) | ((i2 & 0x0003f000) >>> 4)
257						| (i2 & 0x0000003f);
258			}
259			return newKey;
260		}
261	
262		/**
263		 * the DES engine.
264		 */
265		protected function desFunc(wKey:Array, inp:ByteArray, inOff:uint, out:ByteArray, outOff:uint):void
266		{
267			var work:uint;
268			var right:uint;
269			var left:uint;
270	
271			left = (inp[inOff + 0] & 0xff) << 24;
272			left |= (inp[inOff + 1] & 0xff) << 16;
273			left |= (inp[inOff + 2] & 0xff) << 8;
274			left |= (inp[inOff + 3] & 0xff);
275	
276			right = (inp[inOff + 4] & 0xff) << 24;
277			right |= (inp[inOff + 5] & 0xff) << 16;
278			right |= (inp[inOff + 6] & 0xff) << 8;
279			right |= (inp[inOff + 7] & 0xff);
280
281			work = ((left >>> 4) ^ right) & 0x0f0f0f0f;
282			right ^= work;
283			left ^= (work << 4);
284			work = ((left >>> 16) ^ right) & 0x0000ffff;
285			right ^= work;
286			left ^= (work << 16);
287			work = ((right >>> 2) ^ left) & 0x33333333;
288			left ^= work;
289			right ^= (work << 2);
290			work = ((right >>> 8) ^ left) & 0x00ff00ff;
291			left ^= work;
292			right ^= (work << 8);
293			right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff;
294			work = (left ^ right) & 0xaaaaaaaa;
295			left ^= work;
296			right ^= work;
297			left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff;
298
299			for (var round:uint = 0; round < 8; round++)
300			{
301				var fval:uint;
302	
303				work = (right << 28) | (right >>> 4);
304				work ^= wKey[round * 4 + 0];
305				fval = SP7[work & 0x3f];
306				fval |= SP5[(work >>> 8) & 0x3f];
307				fval |= SP3[(work >>> 16) & 0x3f];
308				fval |= SP1[(work >>> 24) & 0x3f];
309				work = right ^ wKey[round * 4 + 1];
310				fval |= SP8[work & 0x3f];
311				fval |= SP6[(work >>> 8) & 0x3f];
312				fval |= SP4[(work >>> 16) & 0x3f];
313				fval |= SP2[(work >>> 24) & 0x3f];
314				left ^= fval;
315				work = (left << 28) | (left >>> 4);
316				work ^= wKey[round * 4 + 2];
317				fval = SP7[work & 0x3f];
318				fval |= SP5[(work >>> 8) & 0x3f];
319				fval |= SP3[(work >>> 16) & 0x3f];
320				fval |= SP1[(work >>> 24) & 0x3f];
321				work = left ^ wKey[round * 4 + 3];
322				fval |= SP8[work & 0x3f];
323				fval |= SP6[(work >>> 8) & 0x3f];
324				fval |= SP4[(work >>> 16) & 0x3f];
325				fval |= SP2[(work >>> 24) & 0x3f];
326				right ^= fval;
327			}
328	
329			right = (right << 31) | (right >>> 1);
330			work = (left ^ right) & 0xaaaaaaaa;
331			left ^= work;
332			right ^= work;
333			left = (left << 31) | (left >>> 1);
334			work = ((left >>> 8) ^ right) & 0x00ff00ff;
335			right ^= work;
336			left ^= (work << 8);
337			work = ((left >>> 2) ^ right) & 0x33333333;
338			right ^= work;
339			left ^= (work << 2);
340			work = ((right >>> 16) ^ left) & 0x0000ffff;
341			left ^= work;
342			right ^= (work << 16);
343			work = ((right >>> 4) ^ left) & 0x0f0f0f0f;
344			left ^= work;
345			right ^= (work << 4);
346	
347			out[outOff + 0] = ((right >>> 24) & 0xff);
348			out[outOff + 1] = ((right >>> 16) & 0xff);
349			out[outOff + 2] = ((right >>> 8) & 0xff);
350			out[outOff + 3] = (right & 0xff);
351			out[outOff + 4] = ((left >>> 24) & 0xff);
352			out[outOff + 5] = ((left >>> 16) & 0xff);
353			out[outOff + 6] = ((left >>> 8) & 0xff);
354			out[outOff + 7] = (left & 0xff);
355		}
356		
357		
358		public function toString():String {
359			return "des";
360		}
361		
362		
363		
364	}
365}