`
ry.china
  • 浏览: 139879 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

XXTEA 算法

    博客分类:
  • java
阅读更多

JavaScript实现

 

/* xxtea.js
*
* Author: Ma Bingyao <andot@ujn.edu.cn>
* Copyright: CoolCode.CN
* Version: 1.2
* LastModified: 2006-05-02
* This library is free. You can redistribute it and/or modify it.
* http://www.coolcode.cn/?p=128
*/

function long2str(v, w) {
var vl = v.length;
var sl = v[vl - 1] & 0xffffffff;
for (var i = 0; i < vl; i++)
{
v[i] = String.fromCharCode(v[i] & 0xff,
v[i] >>> 8 & 0xff,
v[i] >>> 16 & 0xff,
v[i] >>> 24 & 0xff);
}
if (w) {
return v.join('').substring(0, sl);
}
else {
return v.join('');
}
}

function str2long(s, w) {
var len = s.length;
var v = [];
for (var i = 0; i < len; i += 4)
{
v[i >> 2] = s.charCodeAt(i)
| s.charCodeAt(i + 1) << 8
| s.charCodeAt(i + 2) << 16
| s.charCodeAt(i + 3) << 24;
}
if (w) {
v[v.length] = len;
}
return v;
}

function xxtea_encrypt(str, key) {
if (str == "") {
return "";
}
var v = str2long(str, true);
var k = str2long(key, false);
var n = v.length - 1;

var z = v[n], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = 0;
while (q-- > 0) {
sum = sum + delta & 0xffffffff;
e = sum >>> 2 & 3;
for (var 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;
}

return long2str(v, false);
}

function xxtea_decrypt(str, key) {
if (str == "") {
return "";
}
var v = str2long(str, false);
var k = str2long(key, false);
var n = v.length - 1;

var z = v[n - 1], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = q * delta & 0xffffffff;
while (sum != 0) {
e = sum >>> 2 & 3;
for (var 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 long2str(v, true);
}

 

 

 

 

Java实现

/* xxtea.java
*
* Author:       Ma Bingyao < andot@ujn.edu.cn >
* Copyright:    CoolCode.CN
* Version:      1.0
* LastModified: 2006-05-11
* This library is free.  You can redistribute it and/or modify it.
* http://www.coolcode.cn/?p=169
*/
public   class xxtea {
    /**
     * Encrypt data with key.
     *
     * @param data
     * @param key
     * @return
     */
    public   static byte [] encrypt ( byte [] data , byte [] key ) {
        if   ( data . length == 0 ) {
            return   data ;
        }
        return   toByteArray ( encrypt ( toIntArray ( data , true ) , toIntArray ( key , false )) , false ) ;
    }
 
    /**
     * Decrypt data with key.
     *
     * @param data
     * @param key
     * @return
     */
    public   static byte [] decrypt ( byte [] data , byte [] key ) {
        if   ( data . length == 0 ) {
            return   data ;
        }
        return   toByteArray ( decrypt ( toIntArray ( data , false ) , toIntArray ( key , false )) , true ) ;
    }
 
    /**
     * Encrypt data with key.
     *
     * @param v
     * @param k
     * @return
     */
    public   static int [] encrypt ( int [] v , int [] k ) {
        int   n = v . length - 1 ;
        if   ( n < 1 ) {
            return   v ;
        }
        if   ( k . length < 4 ) {
            int []   key = new int [ 4 ] ;
            System . arraycopy ( k , 0 , key , 0 , k . length ) ;
            k = key ;
        }
        int   z = v [ n ] , y = v [ 0 ] , delta = 0x9E3779B9 , sum = 0 , e ;
        int   p , q = 6 + 52 / ( n + 1 ) ;
        while   ( q -- > 0 ) {
            sum = sum + delta ;
            e = sum >>> 2 & 3 ;
            for   ( p = 0 ; p < n ; p ++ ) {
                y = v [ p + 1 ] ;
                z = v [ p ] += ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ;
            }
            y = v [ 0 ] ;
            z = v [ n ] += ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ;
        }
        return   v ;
    }
 
    /**
     * Decrypt data with key.
     *
     * @param v
     * @param k
     * @return
     */
    public   static int [] decrypt ( int [] v , int [] k ) {
        int   n = v . length - 1 ;
        if   ( n < 1 ) {
            return   v ;
        }
        if   ( k . length < 4 ) {
            int []   key = new int [ 4 ] ;
            System . arraycopy ( k , 0 , key , 0 , k . length ) ;
            k = key ;
        }
        int   z = v [ n ] , y = v [ 0 ] , delta = 0x9E3779B9 , sum , e ;
        int   p , q = 6 + 52 / ( n + 1 ) ;
        sum = q * delta ;
        while   ( sum != 0 ) {
            e = sum >>> 2 & 3 ;
            for   ( p = n ; p > 0 ; p -- ) {
                z = v [ p - 1 ] ;
                y = v [ p ] -= ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ;
            }
            z = v [ n ] ;
            y = v [ 0 ] -= ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ;
            sum = sum - delta ;
        }
        return   v ;
    }
 
    /**
     * Convert byte array to int array.
     *
     * @param data
     * @param includeLength
     * @return
     */
    private   static int [] toIntArray ( byte [] data , boolean includeLength ) {
        int   n = ((( data . length & 3 ) == 0 ) ? ( data . length >>> 2 )
                : (( data . length >>> 2 ) + 1 )) ;
        int []   result ;
        if   ( includeLength ) {
            result = new   int [ n + 1 ] ;
            result [ n ] = data . length ;
        }   else {
            result = new   int [ n ] ;
        }
        n = data . length ;
        for   ( int i = 0 ; i < n ; i ++ ) {
            result [ i >>> 2 ] |= ( 0x000000ff & data [ i ]) << (( i & 3 ) << 3 ) ;
        }
        return   result ;
    }
 
    /**
     * Convert int array to byte array.
     *
     * @param data
     * @param includeLength
     * @return
     */
    private   static byte [] toByteArray ( int [] data , boolean includeLength ) {
        int   n ;
        if   ( includeLength ) {
            n = data [ data . length - 1 ] ;
        }   else {
            n = data . length << 2 ;
        }
 
        byte []   result = new byte [ n ] ;
        for   ( int i = 0 ; i < n ; i ++ ) {
            result [ i ] = ( byte )   ( data [ i >>> 2 ] >>> (( i & 3 ) << 3 )) ;
        }
        return   result ;
    }
}

 

 

分享到:
评论

相关推荐

    XXTEA算法 C实现

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

    XXTEA加密算法的C代码实现

    “微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA)都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。...XXTEA算法使用128bit的密钥对以32bit为单位的信息块进行加密。

    DH算法+Xxtea算法Java实现

    XXTEA算法,全称是eXtended eXtremely Fast Encryption Algorithm,是由David Wheeler和Roger Needham在1998年提出的快速加密算法。它是一种块密码,对32位的整数序列进行操作。XXTEA算法相比DES等传统算法,有更高...

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

    在提供的压缩包中,有两个关键文件,分别是`xxtea.cs`和`xxtea.js`,分别代表XXTEA算法的C#和JavaScript实现。C#是一种广泛用于开发Windows桌面应用、Web应用以及游戏的编程语言,而JavaScript则主要应用于网页和...

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

    XXTEA算法是基于原有的分组TEA(Tiny Encryption Algorithm)进行改进的,它在保持高效运行的同时,提升了加密安全性。与TEA相比,XXTEA不仅具有更高的安全性能,可以有效抵御已知的攻击方式,还表现出更快的运行...

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

    XXTEA算法是面向小整数序列的,通常用于简单的数据加密,如在网络通信、文件存储等领域。 在提供的文件列表中,我们看到了多种编程语言实现的XXTEA加密算法版本,包括Java、JavaScript、PHP、C#、ActionScript、C和...

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

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

    XXtea加密算法(C++)

    XXtea算法使用一个迭代的过程,对每个数据块进行多次循环操作。在每次循环中,执行以下步骤: - 计算偏移值`delta`,通常是2^32除以加密轮数的一个小数部分。 - 对于每个数据块`v[i]`,计算`z[i] = v[i] + ((v[i+1...

    Python的XXTEA加密算法库.zip

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

    PHP的XXTEA加密算法扩展.zip

    XXTEA算法基于四轮循环操作,对32位整数进行处理。其基本流程包括四个步骤:Delta、Sum、Add和XOR。它通过一系列非线性的加法、异或和位移操作,使得密文难以被破解。XXTEA的密钥长度是128位,即16个字节,且算法对...

    xxtea.rar_XXTEA

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

    xxtea_java.rar_XXTEA_XXTEA java_java XXTEA_java加解密

    1. **定义XXTEA算法的基本参数**:XXTEA算法基于四个字(32位)的块进行操作,因此需要将输入的数据按照四字节边界进行划分。同时,它使用两个密钥参数`delta`和`k`,其中`delta`通常是固定的常量,如0x9e3779b9,而...

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

    XXTEA算法适用于各种编程语言,包括C#,在这里我们主要关注XXTEA在C#中的实现。 XXTEA算法基于四字节的块进行操作,通过一系列非线性变换对数据进行加密。它的核心是通过迭代循环进行加密,每次迭代都会对数据进行...

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

    本资源提供的是一个Objective-C版本的XXTea封装器,方便开发者在iOS和Mac OS X平台中集成和使用XXTea算法。 XXTea(eXtended eXtended Encryption Algorithm)是由Dong Wei等人设计的一种快速加密算法,主要针对...

    XXTEA加密算法源码

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

    c#_xxtea加解密

    XXTEA算法基于密钥和数据块进行操作,数据块通常为64位,密钥长度则可以灵活调整。其核心算法是通过一系列循环操作和非线性变换实现数据的混淆和扩散,以此达到加密的效果。在解密过程中,算法会逆向执行这些操作,...

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

    2. **安全性高**:经过改进后的XXTEA算法,相比原始的TEA算法,其安全性有了显著提高,不容易受到已知的攻击。 3. **块加密**:XXTEA是一种块密码,它处理固定大小的块(通常是64位),通过多次迭代改变输入块的值...

    xxtea-nodejs-master.zip

    XXTEA算法主要设计用于快速、简单且高效的加密,特别适合于资源有限的环境,如嵌入式系统或JavaScript环境。 项目"xxtea-nodejs-master"的核心内容可能包括以下几个方面: 1. **源代码**:项目可能包含一个或多个....

    xxtea/aes加密解密工具

    XXtea算法通过迭代过程对数据进行加密,提供了较高的安全性,并且计算速度快,适用于嵌入式系统和移动设备。 2. **AES(Advanced Encryption Standard)加密算法**: AES,即高级加密标准,是目前广泛使用的对称...

    xxtea加密工具 附c++源码

    - `cpp_code`可能包含C++源代码示例,展示了如何在C++项目中调用XXTEA算法进行加密和解密操作。 5. 部署和集成: - 将加密的资源和代码打包到最终的应用程序中,确保在运行时能正确解密。 - 在Cocos2d-lua中,...

Global site tag (gtag.js) - Google Analytics