XXTEA for ActionScript 3.0

XXTEA for ActionScript 2.0 的代码在 PHPRPC Client for ActionScript 2.0 中已经包含了,下面是 for ActionScript 3.0 的代码,与 for ActionScript 2.0 相比,3.0 版本加密、解密的内容和密钥都是 ByteArray 类型的数据,这样做不但速度得到的大幅的提升,并且彻底解决了 ActionScript 2.0 版本中对于包含特殊字符串加密解密不正确的问题。

XXTEA.as

ActionScript代码
 
  1. /**********************************************************\ 
  2. |                                                          | 
  3. | The implementation of PHPRPC Protocol 3.0                | 
  4. |                                                          | 
  5. | XXTEA.as                                                 | 
  6. |                                                          | 
  7. | Release 3.0.0                                            | 
  8. | Copyright (c) 2005-2007 by Team-PHPRPC                   | 
  9. |                                                          | 
  10. | WebSite:  http://www.phprpc.org/                         | 
  11. |           http://www.phprpc.net/                         | 
  12. |           http://www.phprpc.com/                         | 
  13. |           http://sourceforge.net/projects/php-rpc/       | 
  14. |                                                          | 
  15. | Authors:  Ma Bingyao <andot@ujn.edu.cn>                  | 
  16. |                                                          | 
  17. | This file may be distributed and/or modified under the   | 
  18. | terms of the GNU Lesser General Public License (LGPL)    | 
  19. | version 3.0 as published by the Free Software Foundation | 
  20. | and appearing in the included file LICENSE.              | 
  21. |                                                          | 
  22. \**********************************************************/  
  23. /* XXTEA encryption arithmetic library. 
  24.  * 
  25.  * Copyright (C) 2006-2007 Ma Bingyao <andot@ujn.edu.cn> 
  26.  * Version: 1.7 
  27.  * LastModified: Nov 5, 2007 
  28.  * This library is free.  You can redistribute it and/or modify it. 
  29.  */  
  30.    
  31. package org.phprpc.util {  
  32.     import flash.utils.ByteArray;  
  33.     import flash.utils.Endian;  
  34.     public class XXTEA {  
  35.         private static const delta:uint = uint(0x9E3779B9);  
  36.         private static function LongArrayToByteArray(data:Array, includeLength:Boolean):ByteArray {  
  37.             var length:uint = data.length;  
  38.             var n:uint = (length - 1) << 2;  
  39.             if (includeLength) {  
  40.                 var m:uint = data[length - 1];  
  41.                 if ((m < n - 3) || (m > n)) {  
  42.                     return null;  
  43.                 }  
  44.                 n = m;  
  45.             }  
  46.             var result:ByteArray = new ByteArray();  
  47.             result.endian = Endian.LITTLE_ENDIAN;  
  48.             for (var i:uint = 0; i < length; i++) {  
  49.                 result.writeUnsignedInt(data[i]);  
  50.             }  
  51.             if (includeLength) {  
  52.                 result.length = n;  
  53.                 return result;  
  54.             }  
  55.             else {  
  56.                 return result;  
  57.             }  
  58.         }  
  59.         private static function ByteArrayToLongArray(data:ByteArray, includeLength:Boolean):Array {  
  60.             var length:uint = data.length;  
  61.             var n:uint = length >> 2;  
  62.             if (length % 4 > 0) {  
  63.                 n++;  
  64.                 data.length += (4 - (length % 4));  
  65.             }  
  66.             data.endian = Endian.LITTLE_ENDIAN;  
  67.             data.position = 0;  
  68.             var result:Array = [];  
  69.             for (var i:uint = 0; i < n; i++) {  
  70.                 result[i] = data.readUnsignedInt();  
  71.             }  
  72.             if (includeLength) {  
  73.                 result[n] = length;  
  74.             }  
  75.             data.length = length;  
  76.             return result;  
  77.         }  
  78.         public static function encrypt(data:ByteArray, key:ByteArray):ByteArray {  
  79.             if (data.length == 0) {  
  80.                 return new ByteArray();  
  81.             }  
  82.             var v:Array = ByteArrayToLongArray(data, true);  
  83.             var k:Array = ByteArrayToLongArray(key, false);  
  84.             if (k.length < 4) {  
  85.                 k.length = 4;  
  86.             }  
  87.             var n:uint = v.length - 1;  
  88.             var z:uint = v[n];  
  89.             var y:uint = v[0];  
  90.             var mx:uint;  
  91.             var e:uint;  
  92.             var p:uint;  
  93.             var q:uint = uint(6 + 52 / (n + 1));  
  94.             var sum:uint = 0;  
  95.             while (0 < q--) {  
  96.                 sum = sum + delta;  
  97.                 e = sum >>> 2 & 3;  
  98.                 for (p = 0; p < n; p++) {  
  99.                     y = v[p + 1];  
  100.                     mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);  
  101.                     z = v[p] = v[p] + mx;  
  102.                 }  
  103.                 y = v[0];  
  104.                 mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);  
  105.                 z = v[n] = v[n] + mx;  
  106.             }  
  107.             return LongArrayToByteArray(v, false);  
  108.         }  
  109.         public static function decrypt(data:ByteArray, key:ByteArray):ByteArray {  
  110.             if (data.length == 0) {  
  111.                 return new ByteArray();  
  112.             }  
  113.             var v:Array = ByteArrayToLongArray(data, false);  
  114.             var k:Array = ByteArrayToLongArray(key, false);  
  115.             if (k.length < 4) {  
  116.                 k.length = 4;  
  117.             }  
  118.             var n:uint = v.length - 1;  
  119.             var z:uint = v[n - 1];  
  120.             var y:uint = v[0];  
  121.             var mx:uint;  
  122.             var e:uint;  
  123.             var p:uint;  
  124.             var q:uint = uint(6 + 52 / (n + 1));  
  125.             var sum:uint = q * delta;  
  126.             while (sum != 0) {  
  127.                 e = sum >>> 2 & 3;  
  128.                 for (p = n; p > 0; p--) {  
  129.                     z = v[p - 1];  
  130.                     mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);  
  131.                     y = v[p] = v[p] - mx;  
  132.                 }  
  133.                 z = v[n];  
  134.                 mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);  
  135.                 y = v[0] = v[0] - mx;  
  136.                 sum = sum - delta;  
  137.             }  
  138.             return LongArrayToByteArray(v, true);  
  139.         }  
  140.     }  
  141. }  

标签: Cryptology, ActionScript/Flash

« 上一篇 | 下一篇 »

只显示10条记录相关文章

发表评论

评论 (必须):