1. 云栖社区>
  2. PHP教程>
  3. 正文

XXTEA算法的AS3现实

作者:用户 来源:互联网 时间:2017-12-01 12:07:55

算法as3XXTEA

XXTEA算法的AS3现实 - 摘要: 本文讲的是XXTEA算法的AS3现实, http://bbs.9ria.com/viewthread.php?tid=75135&extra=page%3D2%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000XXTE


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[i] = str[i];
}
v[v.length] = str.length; var k:Array = new Array(key.length);
for(i = 0; i < key.length; ++i)
{
k[i] = key[i];
} if (k.length < 4)
{
k.length = 4;
}
var n:int = v.length - 1;
var z:int = v[n], y:int = v[0], 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[p + 1];
mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
z = v[p] = v[p] + mx & 0xffffffff;
}
y = v[0];
mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
z = v[n] = v[n] + 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[i];
ret[i * 4] = (datVal >> 24) & 0x000000ff;
ret[i * 4 + 1] = (datVal >> 16) & 0x000000ff;
ret[i * 4 + 2] = (datVal >> 8) & 0x000000ff;
ret[i * 4 + 3] = 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[i] = (str[i * 4] << 24)
| (str[i * 4 + 1] << 16)
| (str[i * 4 + 2] << 8)
| (str[i * 4 + 3]);
} var k:Array = new Array(key.length);
for(i = 0; i < key.length; ++i)
{
k[i] = key[i];
}
if (k.length < 4)
{
k.length = 4;
}
var n:int = v.length - 1;
var z:int = v[n - 1], y:int = v[0], 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[p - 1];
mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
y = v[p] = v[p] - mx & 0xffffffff;
}
z = v[n];
mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
y = v[0] = v[0] - mx & 0xffffffff;
sum = sum - delta & 0xffffffff;
}
return v.slice(0, v.length - 1);
}}
}

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法 , as3 , XXTEA ,以便于您获取更多的相关知识。

稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一

6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

开发者常用软件,超百款实用软件一站式提供