`

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[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); 
                }
                
                
        }
}
分享到:
评论

相关推荐

    XXTEA算法 C实现

    XXTEA算法的C语言实现,内含测试代码,编译后可直接运行

    XXTEA加密算法的C代码实现

    “微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。 TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 ...

    DH算法+Xxtea算法Java实现

    3. 使用XXTEA算法进行加密和解密: ```java // 假设我们有需要加密的数据data byte[] data = ...; // 使用协商出的密钥进行XXTEA加密 int[] keys = new int[4]; System.arraycopy(sharedKey1, 0, keys, 0, 4); ...

    xxtea as3 c

    XXTEA AS3和C实现的对比展示了两种不同编程语言在实现同一加密算法时的差异。AS3的面向对象特性使得加密操作更易封装,而C语言的低级特性使其更适合系统级编程。两者都提供了解决小块数据安全传输的有效工具,开发者...

    XXtea 加密算法的JS实现和C#实现(源码)

    XXTEA(Extreme eXtended Encryption Technique Algorithm)是一种简单的块加密算法,由David Wheeler和Roger Needham在1994年提出。该算法设计简洁,执行效率高,尤其适用于资源有限的环境,如Web解决方案。XXTEA的...

    XXTEA加密算法各种语言实现整理

    3. **Photoshop脚本(xxtea.ps)**:XXTEA的Photoshop脚本版本可能用于在图像文件处理过程中加密元数据,保护创作者的信息或者确保数据安全。 4. **Delphi实现(xxtea_delphi.txt)**:Delphi是基于Pascal的面向...

    XXTEA加密算法源码

    TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据。TEA特点是速度快、效率高,实现也非常简单。由于针对TEA的攻击不断出现,所以TEA也发展出...

    xxtea-java, Java的XXTEA加密算法库.zip

    xxtea-java, Java的XXTEA加密算法库 用于 Java 的 XXTEA 简介XXTEA是一种快速安全的加密算法。 这是一个用于Java的XXTEA库。它与原始的XXTEA加密算法不同。 它加密和解密字节 [] 而不是 32bit 整数 array,键也

    XXtea加密算法(C++)

    XXtea加密算法是一种轻量级的加密算法,主要用于保护数据的隐私性和安全性。该算法由David Wheeler和Roger Needham在1998年提出,原名为“Simple Encryption Algorithm”(SEA),后更名为XXtea,是“eXtended Xor ...

    PHP的XXTEA加密算法扩展.zip

    XXTEA(Extreme eXtended TEA),是一种在1998年由David Wheeler和Roger Needham提出的高效、安全的块密码算法。它是TEA(Tiny Encryption Algorithm)的增强版本,修复了TEA算法的一些安全漏洞,并提供了更好的性能...

    Python的XXTEA加密算法库.zip

    XXTEA(Extreme eXtended TEA,极度扩展的TEA)是一种对称加密算法,由David Wheeler和Roger Needham在1994年提出,是对Tiny Encryption Algorithm(TEA)的改进版本。TEA虽然简洁,但在某些情况下可能不够安全,而...

    xxtea.rar_XXTEA

    XXTEA算法是一种高效、简洁的微积分加密算法,由David Wheeler和Roger Needham于1994年提出,主要用于短数据块的加密。在给定的“xxtea.rar_XXTEA”压缩包中,我们可以看到一个名为“hello”的文件,这可能是用XXTEA...

    xxtea_java.rar_XXTEA_XXTEA java_java XXTEA_java加解密

    3. **加密过程**:XXTEA的加密过程通过执行多次循环(通常为64次)进行,每个循环包含四步操作:(i) 加法操作,(ii) XOR操作,(iii) 滚动操作,以及(iv) 乘法操作。这些操作使得加密过程具有非线性,从而增加破解...

    一种适用于RFID读写器的加密算法

    为解决这些问题,文章介绍了一种专门应用于RFID读写器的加密算法——XXTEA(Corrected Block Tiny Encryption Algorithm),并对该算法进行了深入分析。 XXTEA算法是基于原有的分组TEA(Tiny Encryption Algorithm...

    XXTEA.rar_XXTEA_xxtea CSharp _xxtea c#_xxtea修改器_xxtea加密源码

    XXTEA(Extreme eXtended TEA,极度扩展的TEA)是一种快速且安全的块密码算法,由David Wheeler和Roger Needham在1997年提出。它是在Tiny Encryption Algorithm (TEA)的基础上改进的,提高了安全性,并解决了原始TEA...

    XXTea 加密算法的 Objective-C 包装器_代码_下载

    XXTea加密算法是一种在Objective-C开发中常用的轻量级数据加密技术,它以其高效、简单的特点被广泛应用于移动应用和软件开发。本资源提供的是一个Objective-C版本的XXTea封装器,方便开发者在iOS和Mac OS X平台中...

    c#_xxtea加解密

    3. 使用预定义的XXTEA常数和密钥进行非线性变换。 4. 应用特定的轮数(通常为64轮)来确保足够的安全性。 5. 结合所有加密或解密后的数据块,形成完整的加密或解密结果。 在C#中,你可以使用`unsafe`关键字来处理...

    DELPHI 的 XXTEA加密算法

    高于TEA的加密算法,值得使用!破解时间比TEA时间要长。

    SQLite-XXTEA加密-源代码

    这几日有时间,自己就用XXTEA算法在 SQLite3.3.7版本的基础上实现了加密功能。选择XXTEA主要是因为这个算法速度很快,对性能造成的影响相对较小。顺便修改了网上流传的XXTEA代码的一处内存越界的BUG。 用SQLite的...

    XXTEA加密解密 iOS 的 Objective-C 完美实现

    XXTEA(Extreme eXtended TEA,极度扩展的TEA)是一种对称加密算法,由David Wheeler和Roger Needham在1994年提出,是对Tiny Encryption Algorithm(TEA)的改进版本。它提供了更好的安全性和效率,被广泛用于软件和...

Global site tag (gtag.js) - Google Analytics