XXTEA 算法

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 ;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值