1. 程式人生 > >XXTEA 加解密 as3 和 Python 分別實現

XXTEA 加解密 as3 和 Python 分別實現

加解密程式碼

package 
{
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.utils.ByteArray;
	
	public class Test extends Sprite {
		
		public function Test() {
			var dataStr:String = "Today's weather is good.";
			var data:ByteArray = new ByteArray();
			data.writeMultiByte(
dataStr, "utf-8"); var keyStr:String = "abcxyz123"; var key:ByteArray = new ByteArray(); key.writeMultiByte(keyStr, "utf-8"); trace("data:", dataStr); trace("key:", keyStr); //加密 var encryptData:ByteArray = XXTEA.encrypt(data, key); var content:String = Base64.encodeByteArray(
encryptData); trace("encode: " + content); //解密 encryptData = Base64.decodeToByteArray(content); var sourceBtyes:ByteArray = XXTEA.decrypt(encryptData, key); var sourceStr:String = sourceBtyes.toString(); trace("decode: " + sourceStr ); } } }

XXTEA加解密用到了Base64,以下是XXTEA和Base64的程式碼

XXTEA的程式碼

package 
{	
	import flash.utils.ByteArray;   
	import flash.utils.Endian;   
	
	public class XXTEA {  
		
		private static const delta:uint = uint(0x9E3779B9);   
		
		private static function LongArrayToByteArray(data:Array, includeLength:Boolean):ByteArray {   
			var length:uint = data.length;   
			var n:uint = (length - 1) << 2;   
			if (includeLength) {   
				var m:uint = data[length - 1];   
				if ((m < n - 3) || (m > n)) {   
					return null;   
				}   
				n = m;   
			}   
			var result:ByteArray = new ByteArray();   
			result.endian = Endian.LITTLE_ENDIAN;   
			for (var i:uint = 0; i < length; i++) {   
				result.writeUnsignedInt(data[i]);   
			}   
			if (includeLength) {   
				result.length = n;   
				return result;   
			}   
			else {   
				return result;   
			}   
		}  
		
		private static function ByteArrayToLongArray(data:ByteArray, includeLength:Boolean):Array {   
			var length:uint = data.length;   
			var n:uint = length >> 2;   
			if (length % 4 > 0) {   
				n++;   
				data.length += (4 - (length % 4));   
			}   
			data.endian = Endian.LITTLE_ENDIAN;   
			data.position = 0;   
			var result:Array = [];   
			for (var i:uint = 0; i < n; i++) {   
				result[i] = data.readUnsignedInt();   
			}   
			if (includeLength) {   
				result[n] = length;   
			}   
			data.length = length;   
			return result;   
		} 
		
		public static function encrypt(data:ByteArray, key:ByteArray):ByteArray {   
			if (data.length == 0) {   
				return new ByteArray();   
			}   
			var v:Array = ByteArrayToLongArray(data, true);   
			var k:Array = ByteArrayToLongArray(key, false);   
			if (k.length < 4) {   
				k.length = 4;   
			}   
			var n:uint = v.length - 1;   
			var z:uint = v[n];   
			var y:uint = v[0];   
			var mx:uint;   
			var e:uint;   
			var p:uint;   
			var q:uint = uint(6 + 52 / (n + 1));   
			var sum:uint = 0;   
			while (0 < q--) {   
				sum = sum + delta;   
				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;   
				}   
				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;   
			}   
			return LongArrayToByteArray(v, false);   
		}   
		
		public static function decrypt(data:ByteArray, key:ByteArray):ByteArray {   
			if (data.length == 0) {   
				return new ByteArray();   
			}   
			var v:Array = ByteArrayToLongArray(data, false);   
			var k:Array = ByteArrayToLongArray(key, false);   
			if (k.length < 4) {   
				k.length = 4;   
			}   
			var n:uint = v.length - 1;   
			var z:uint = v[n - 1];   
			var y:uint = v[0];   
			var mx:uint;   
			var e:uint;   
			var p:uint;   
			var q:uint = uint(6 + 52 / (n + 1));   
			var sum:uint = q * delta;   
			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;   
				}   
				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;   
				sum = sum - delta;   
			}   
			return LongArrayToByteArray(v, true);   
		}   
	}   
}  

Base64的程式碼

package
{	
	import flash.utils.ByteArray;    
	
	public class Base64 {    
 
		private static const BASE64_CHARS:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";             
		
		
		public static const version:String = "1.0.0";    
		
		public static function encode(data:String):String {    
			// Convert string to ByteArray    
			var bytes:ByteArray = new ByteArray();    
			bytes.writeUTFBytes(data);    
			
			// Return encoded ByteArray    
			return encodeByteArray(bytes);    
		}    
		
		public static function encodeByteArray(data:ByteArray):String {    
			// Initialise output    
			var output:String = "";    
			
			// Create data and output buffers    
			var dataBuffer:Array;    
			var outputBuffer:Array = new Array(4);    
			
			// Rewind ByteArray    
			data.position = 0;    
			
			// while there are still bytes to be processed    
			while (data.bytesAvailable > 0) {    
				// Create new data buffer and populate next 3 bytes from data    
				dataBuffer = new Array();    
				for (var i:uint = 0; i < 3 && data.bytesAvailable > 0; i++) {    
					dataBuffer[i] = data.readUnsignedByte();    
				}    
				
				// Convert to data buffer Base64 character positions and     
				// store in output buffer    
				outputBuffer[0] = (dataBuffer[0] & 0xfc) >> 2;    
				outputBuffer[1] = ((dataBuffer[0] & 0x03) << 4) | ((dataBuffer[1]) >> 4);    
				outputBuffer[2] = ((dataBuffer[1] & 0x0f) << 2) | ((dataBuffer[2]) >> 6);    
				outputBuffer[3] = dataBuffer[2] & 0x3f;    
				
				// If data buffer was short (i.e not 3 characters) then set    
				// end character indexes in data buffer to index of '=' symbol.    
				// This is necessary because Base64 data is always a multiple of    
				// 4 bytes and is basses with '=' symbols.    
				for (var j:uint = dataBuffer.length; j < 3; j++) {    
					outputBuffer[j + 1] = 64;    
				}    
				
				// Loop through output buffer and add Base64 characters to     
				// encoded data string for each character.    
				for (var k:uint = 0; k < outputBuffer.length; k++) {    
					output += BASE64_CHARS.charAt(outputBuffer[k]);    
				}    
			}    
			
			// Return encoded data    
			return output;    
		}    
		
		public static function decode(data:String):String {    
			// Decode data to ByteArray    
			var bytes:ByteArray = decodeToByteArray(data);    
			
			// Convert to string and return    
			return bytes.readUTFBytes(bytes.length);    
		}    
		
		public static function decodeToByteArray(data:String):ByteArray {    
			// Initialise output ByteArray for decoded data    
			var output:ByteArray = new ByteArray();    
			
			// Create data and output buffers    
			var dataBuffer:Array = new Array(4);    
			var outputBuffer:Array = new Array(3);    
			
			// While there are data bytes left to be processed    
			for (var i:uint = 0; i < data.length; i += 4) {    
				// Populate data buffer with position of Base64 characters for    
				// next 4 bytes from encoded data    
				for (var j:uint = 0; j < 4 && i + j < data.length; j++) {    
					dataBuffer[j] = BASE64_CHARS.indexOf(data.charAt(i + j));    
				}    
				
				// Decode data buffer back into bytes    
				outputBuffer[0] = (dataBuffer[0] << 2) + ((dataBuffer[1] & 0x30) >> 4);    
				outputBuffer[1] = ((dataBuffer[1] & 0x0f) << 4) + ((dataBuffer[2] & 0x3c) >> 2);            
				outputBuffer[2] = ((dataBuffer[2] & 0x03) << 6) + dataBuffer[3];    
				
				// Add all non-padded bytes in output buffer to decoded data    
				for (var k:uint = 0; k < outputBuffer.length; k++) {    
					if (dataBuffer[k+1] == 64) break;    
					output.writeByte(outputBuffer[k]);    
				}    
			}    
			
			// Rewind decoded data ByteArray    
			output.position = 0;    
			
			// Return decoded data    
			return output;    
		}    
		
		public function Base64() {    
			throw new Error("Base64 class is static container only");    
		}    
	}    
}  

以下是Python程式碼
xxtea.py

import struct  
  
_DELTA = 0x9E3779B9  
  
def _long2str(v, w):  
    n = (len(v) - 1) << 2  
    if w:  
        m = v[-1]  
        if (m < n - 3) or (m > n): return ''  
        n = m  
    s = struct.pack('<%iL' % len(v), *v)  
    return s[0:n] if w else s  
  
def _str2long(s, w):  
    n = len(s)  
    m = (4 - (n & 3) & 3) + n  
    s = s.ljust(m, "\0")  
    v = list(struct.unpack('<%iL' % (m >> 2), s))  
    if w: v.append(n)  
    return v  
  
def encrypt(str, key):  
    if str == '': return str  
    v = _str2long(str, True)  
    k = _str2long(key.ljust(16, "\0"), False)  
    n = len(v) - 1  
    z = v[n]  
    y = v[0]  
    sum = 0  
    q = 6 + 52 // (n + 1)  
    while q > 0:  
        sum = (sum + _DELTA) & 0xffffffff  
        e = sum >> 2 & 3  
        for p in xrange(n):  
            y = v[p + 1]  
            v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
            z = v[p]  
        y 
            
           

相關推薦

XXTEA 解密 as3 Python 分別實現

加解密程式碼 package { import flash.display.Shape; import flash.display.Sprite; import flash.utils.ByteArray; public class Test extends Sprite

基於thrift的javapython分別作為客戶端服務端的調用實現

Coding except arr pes com ssa utf-8 encoding 中文亂碼 前面已經實現了純java的thrift的實現。 現在實現實現一下python作為客戶端和服務端的thrift的調用 1.python作為客戶端,java作為服務端 java服

ROS下利用PythonOpenCVC分別實現筆記本攝像頭/USB攝像頭/監控IP攝像頭資料的獲取

說明: 最近的一個小任務,記錄一下,希望對以後有幫助吧: -———————————————————————————————————————————————— 參考帖子 一、先利用python實現筆記本攝像頭/USB攝像頭的資料的獲取: 程式碼如下: i

用jsjq分別實現二級聯動效果

js jq 二級聯動界面: 兩個下拉框。用js方法實現:用jq方法實現:註意:在js中的for(var a in 數組) 其中的變量a依舊是下標,不是元素的值,跟其他的語言有點不一樣。同時,在js中,數組的下標是可以存放文字的。用js和jq分別實現二級聯動效果

通過jQueryC#分別實現對.NET Core Web Api的訪問以及文件上傳

補充 param 詳細 ace lin col mage exp n) 準備工作:    建立.NET Core Web Api項目    新建一個用於Api請求的UserInfo類 public class UserInfo { publ

LeetCode練習:蓄水池問題 (內附JavaPython實現方法)

      刷了道練習題目,關於蓄水池的問題,這裡我分別用Python和Java實現一下。 題目: Given n non-negative integers a1, a2, ..., an , w

用while,for分別實現九九乘法表

package ex; public class chengfabia { public static void main(String[] args) { // TODO Auto-generated method stub int i,j;

Somte演算法Python程式碼實現

SMOTE全稱是Synthetic Minority Oversampling Technique,即合成少數類過取樣技術。 它是基於隨機過取樣演算法的一種改進方案。 由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的資

SpringBoot30 整合Mybatis-Plus、整合Redis、利用EhcacheRedis分別實現二級快取

1 環境說明   JDK: 1.8   MAVEN: 3.   SpringBoot: 2.0.4 2 SpringBoot整合Mybatis-Plus   2.1 建立SpringBoot     利用IDEA建立SpringBoot專案,引入web mysql mybatis-plus lombok

jqueyjs分別實現在圖片不知道大小的情況下始終居中在螢幕的中央

直接上程式碼 js程式碼 var img=document.getElementById('img'); console.log(img); var W=img.offsetWidth;//獲取圖片的寬度 console.log(W);

用LinearLayoutRelativeLayout分別實現簡單的登陸介面

        LinearLayout是最簡單也是最常用的一種佈局方式,它根據orientation 屬性值,將包含的所有控制元件或佈局物件排列在同一個方向:水平或垂直,在這種佈局中,所有的控制元件都是依序排列成一條線。線上性佈局中的控制元件允許有自己的margins和g

jqueryjs分別實現獲取checkbox的值+jquery實現複選框全選

//jquery實現全選 $(function(){ $("#checkAll").click(function(){ $(".checkOne").attr("checked",this.checked) }) }) //批量刪除jquery實現提示 function p_d

常見資料探勘演算法Python簡單實現

1、K近鄰演算法 原理:計算待分類樣本與每個訓練樣本的距離,取距離最小的K個樣本,這k個樣本,哪個類別佔大多數,則該樣本屬於這個類別。 優點:1、無需訓練和估計引數,2、適合多分類,3、適合樣本容量比較大的問題 缺點:1、對測試樣本記憶體開銷大,2、可解釋性差,無法

jsjQuery分別實現 單選框、複選框、下拉列表的表單驗證

關於頁面表單驗證:一些簡單的理解單選框/複選框:js程式碼:$(function () { $("#Button").click(function () {var love = document.getElementsByName("love"); for(var i

機器學習與神經網路(四):BP神經網路的介紹Python程式碼實現

前言:本篇博文主要介紹BP神經網路的相關知識,採用理論+程式碼實踐的方式,進行BP神經網路的學習。本文首先介紹BP神經網路的模型,然後介紹BP學習演算法,推導相關的數學公式,最後通過Python程式碼實現BP演算法,從而給讀者一個更加直觀的認識。 1.BP網路模型 為了將理

機器學習與神經網路(二):感知器的介紹Python程式碼實現

前言:本篇博文主要介紹感知器的相關知識,採用理論+程式碼實踐的方式,進行感知器的學習。本文首先介紹感知器的模型,然後介紹感知器學習規則(Perceptron學習演算法),最後通過Python程式碼實現單層感知器,從而給讀者一個更加直觀的認識。 1.單層感知器模型 單層感知器

Android典型介面設計(5)——使用SlidingMenuDrawerLayout分別實現左右側邊欄

public class MainActivity extends Activity { private DrawerLayout drawerLayout; private ActionBarDrawerToggle toggle; private ActionBar ac

HadoopSpark分別實現二次排序

將下列資料中每個分割槽中的第一列順序排列,第二列倒序排列。 Text  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 2021 5051

【JAVA】常用解密演算法總結及JAVA實現【BASE64,MD5,SHA,DES,3DES,AES,RSA】

BASE64 這其實是一種編解碼方法,但是隻要我們能夠將原文變成肉眼不可識別的內容,其實就是一種加密的方法。 BASE64 的編碼都是按字串長度,以每 3 個 8 bit 的字元為一組,然後針對每組,首先獲取每個字元的 ASCII 編碼,然後將 ASCII 編碼轉換成 8

仿射密碼解密及暴力破解c++實現

#include <iostream> #include <string.h> using namespace std; char m[100]; char c[100]; int gcd(int a,int b) //輾轉相除法求a,b的最大公約數 { int k=0; d