4 * An ActionScript 3 implementation of the XTea algorithm
\r
5 * Copyright (c) 2007 Henri Torgemane
\r
7 * See LICENSE.txt for full license information.
\r
9 package com.hurlant.crypto.symmetric
\r
11 import com.hurlant.crypto.prng.Random;
\r
12 import com.hurlant.util.Memory;
\r
14 import flash.utils.ByteArray;
\r
17 public class XTeaKey implements ISymmetricKey
\r
19 public const NUM_ROUNDS:uint = 64;
\r
20 private var k:Array;
\r
22 public function XTeaKey(a:ByteArray) {
\r
24 k = [a.readUnsignedInt(),a.readUnsignedInt(),a.readUnsignedInt(),a.readUnsignedInt()];
\r
27 * K is an hex string with 32 digits.
\r
29 public static function parseKey(K:String):XTeaKey {
\r
30 var a:ByteArray = new ByteArray;
\r
31 a.writeUnsignedInt(parseInt(K.substr(0,8),16));
\r
32 a.writeUnsignedInt(parseInt(K.substr(8,8),16));
\r
33 a.writeUnsignedInt(parseInt(K.substr(16,8),16));
\r
34 a.writeUnsignedInt(parseInt(K.substr(24,8),16));
\r
36 return new XTeaKey(a);
\r
39 public function getBlockSize():uint {
\r
43 public function encrypt(block:ByteArray, index:uint=0):void {
\r
44 block.position = index;
\r
45 var v0:uint = block.readUnsignedInt();
\r
46 var v1:uint = block.readUnsignedInt();
\r
49 var delta:uint = 0x9E3779B9;
\r
50 for (i=0; i<NUM_ROUNDS; i++) {
\r
51 v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
\r
53 v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
\r
56 block.writeUnsignedInt(v0);
\r
57 block.writeUnsignedInt(v1);
\r
60 public function decrypt(block:ByteArray, index:uint=0):void {
\r
61 block.position = index;
\r
62 var v0:uint = block.readUnsignedInt();
\r
63 var v1:uint = block.readUnsignedInt();
\r
65 var delta:uint = 0x9E3779B9;
\r
66 var sum:uint = delta*NUM_ROUNDS;
\r
67 for (i=0; i<NUM_ROUNDS; i++) {
\r
68 v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
\r
70 v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
\r
73 block.writeUnsignedInt(v0);
\r
74 block.writeUnsignedInt(v1);
\r
77 public function dispose():void {
\r
78 //private var k:Array;
\r
79 var r:Random = new Random;
\r
80 for (var i:uint=0;i<k.length;i++) {
\r
81 k[i] = r.nextByte();
\r
88 public function toString():String {
\r