AS3 发表于 2013-1-28 09:50:50

XXTEA算法的AS3现实

http://bbs.9ria.com/viewthread.php?tid=75135&extra=page%3D2%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000


XXTEA算法是什么?可以去百度一下,它是一个非常快速小巧的加解密算法。因为快速,所以一般用于协议加解密。
由于这个算法的规范是公开的,所以算法本身是不需要保密的。但是,在网上很少看到有基于AS3的实现。
由于做了一个动态内存加密的组件需要用到加密算法,就正好把它实现了。

另:该算法很多基于C的实现,都是对字节流进行加解密。由于Flash的应用更趋向于字符串操作,所以,我只实现了基于字符串的XXTEA。
我想这相对于对基于ByteArray的实现,对大家更有用。

/*************************************************************************版权所有 (C), 1998-2009*************************************************************************//*************************************************************************#   File Name   :   XXTEA.as#   Version   :   1.0.0#   Author      :   slicoltang#   Date      :   2009-2#   Comment   :   一个XXTEA算法的实现类。*                                       实现基于字符数组的XXTEA。*                                       后续将实现基于字节流的XXTEA。* *                                       如有疑问,请与本人联系。#          Modify      :   2009-2 文件创建 #*************************************************************************/package com.tencent.fge.codec.tea{      public class XXTEA      {                public function XXTEA()                {                }                public static function encrypt_CharArray(str:Array, key:Array):Array                {                     if (str == null || str.length == 0)                     {                         return null;                     }                                                            var v:Array = new Array(str.length);                     var i:int = 0;                     for(i = 0; i < str.length; ++i)                  {                            v = str;                  }                  v = str.length;                                                            var k:Array = new Array(key.length);                     for(i = 0; i < key.length; ++i)                  {                            k = key;                  }                                                                              if (k.length < 4)                     {                         k.length = 4;                     }                     var n:int = v.length - 1;                                       var z:int = v, y:int = v, delta:int = 0x9E3779B9;                     var mx:int, e:int, p:int, q:int = Math.floor(6 + 52 / (n + 1)), sum:int = 0;                                       while (0 < q--)                     {                         sum = sum + delta & 0xffffffff;                         e = sum >>> 2 & 3;                         for (p = 0; p < n; p++)                         {                           y = v;                           mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k ^ z);                           z = v = v + mx & 0xffffffff;                         }                         y = v;                         mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k ^ z);                         z = v = v + mx & 0xffffffff;                     }                                                             //在这里进行分割                  var datLen:int = v.length;                  var ret:Array = new Array(datLen * 4);                  var datVal:uint = 0;                  i = 0;                  while(i < datLen)                  {                            datVal = v;                            ret = (datVal >> 24) & 0x000000ff;                            ret = (datVal >> 16) & 0x000000ff;                            ret = (datVal >> 8) & 0x000000ff;                            ret = datVal & 0x000000ff;                            ++i;                  }                                    return ret;               }                                 public static function decrypt_CharArray(str:Array, key:Array):Array                {                     if (str == null || str.length == 0 || str.length % 4 != 0)                     {                         return null;                     }                                                            //合并数据                  var datLen:int = str.length / 4;                  var v:Array = new Array(datLen);                  var datVal:uint = 0;                     var i:int = 0;                     for(i = 0; i < datLen; ++i)                  {                            v = (str << 24)                                     | (str << 16)                                     | (str << 8)                                     | (str);                  }                                                            var k:Array = new Array(key.length);                     for(i = 0; i < key.length; ++i)                  {                            k = key;                  }                                        if (k.length < 4)                     {                         k.length = 4;                     }                     var n:int = v.length - 1;                                       var z:int = v, y:int = v, delta:int = 0x9E3779B9;                     var mx:int, e:int, p:int, q:int = Math.floor(6 + 52 / (n + 1)), sum:int = q * delta & 0xffffffff;                     while (sum != 0)                     {                         e = sum >>> 2 & 3;                         for (p = n; p > 0; p--)                         {                           z = v;                           mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k ^ z);                           y = v = v - mx & 0xffffffff;                         }                         z = v;                         mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k ^ z);                         y = v = v - mx & 0xffffffff;                         sum = sum - delta & 0xffffffff;                     }                     return v.slice(0, v.length - 1);               }                                        }}
页: [1]
查看完整版本: XXTEA算法的AS3现实