1  /**
     2   * com.sekati.crypt.RC4
     3   * @version 1.0.5
     4   * @author jason m horwitz | sekati.com
     5   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     6   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     7   * 
     8   * Sourced from ascrypt for dependencies only - version 1.0, author Mika Pamu
     9   * Orginal Flash port by: Gabor Penoff - http://www.fns.hu | fns@fns.hu
    10   */
    11  
    12  import com.sekati.crypt.ICipher;
    13  
    14  /**
    15   * Encrypts and decrypts an alleged RC4 hash.
    16   */
    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  	/**
    23  	 * Encrypts a string with the specified key.
    24  	 * @param src (String) string to encrypt
    25  	 * @param key (String) encryption key
    26  	 * @return String
    27  	 */
    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  	/**
    36  	 * Decrypts a string with the specified key.
    37  	 * @param src (String) string to decrypt
    38  	 * @param key (String) decryption key
    39  	 * @return String
    40  	 */
    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  }