TX牧场出新加密算法PastureKey,c#实现方法
拿起工具,反编译swf文件,一看……找全算法相关的as脚本如下:
view plaincopy to clipboardprint?
var by:String = "0123456789abcdef";
function encode(param1:String) : Array
{
var _loc_2:Array = new Array();
var _loc_3:Number = param1.length * 8;
var _loc_4:Number = 255;
var _loc_5:Number = 0;
while (_loc_5 < _loc_3)
{
//trace((_loc_5>>5)+"=loc5");
var a =_loc_2;
var b = (param1.charCodeAt(_loc_5 / 8) & _loc_4);
_loc_2 = (a | b << (24 - _loc_5 % 32));
_loc_5 = _loc_5 + 8;
}
_loc_2 = _loc_2 | 128 << 24 - _loc_3 % 32;
_loc_2[(_loc_3 + 64 >> 9 << 4) + 15] = _loc_3;
return _loc_2;
}// end function
function f(param1:Number, param2:Number, param3:Number, param4:Number) : Number
{
if (param1 < 20)
{
return param2 & param3 | ~param2 & param4;
}
if (param1 < 40)
{
return param2 ^ param3 ^ param4;
}
if (param1 < 60)
{
return param2 & param3 | param2 & param4 | param3 & param4;
}
return param2 ^ param3 ^ param4;
}// end function
function Uz(param1:Number) : Number
{
if (param1 < 20)
{
return 1518500249;
}
if (param1 < 40)
{
return 1859775393;
}
if (param1 < 60)
{
return 2400959708;
}
return 3395469782;
}// end function
var int1;
var int2;
var int3;
var int4;
var int5;
function encode2(param1:Array) : Array
{
var _loc_11:Number = 0;
var _loc_12:Number = 0;
var _loc_13:Number = 0;
var _loc_14:Number = 0;
var _loc_15:Number = 0;
var _loc_16:Number = 0;
var _loc_17:Number = 0;
var _loc_2:Number = 1732584193;
var _loc_3:Number = 4023233417;
var _loc_4:Number = 2562383102;
var _loc_5:Number = 271733878;
var _loc_6:Number = 3285377520;
var _loc_7:Number = param1.length;
var _loc_8:Array = new Array(80);
var _loc_9:Number = 0;
while (_loc_9 < _loc_7)
{
_loc_11 = _loc_2;
_loc_12 = _loc_3;
_loc_13 = _loc_4;
_loc_14 = _loc_5;
_loc_15 = _loc_6;
_loc_16 = 0;
while (_loc_16 < 80)
{
if (_loc_16 < 16)
{
_loc_8 = param1;
//trace(_loc_2+"<>"+_loc_17);
}
else
{
var bb = _loc_8 ^ _loc_8 ^ _loc_8 ^ _loc_8;
_loc_8 = mv(bb, 1);
}
var cc = f(_loc_16, _loc_12, _loc_13, _loc_14) ;
var dd = Uz(_loc_16);
//trace("cc["+cc+"]dd["+dd+"]");
_loc_17 = mv(_loc_11, 5) + cc + _loc_15 + int(_loc_8) + dd;
//trace("_loc_17="+_loc_17);
_loc_15 = _loc_14;
_loc_14 = _loc_13;
_loc_13 = mv(_loc_12, 30);
trace(_loc_16+","+_loc_12+","+_loc_13+","+_loc_14+",_loc_12="+_loc_12);
_loc_12 = _loc_11;
_loc_11 = _loc_17;
_loc_16++;
}
_loc_2 = _loc_2 + _loc_11;
_loc_3 = _loc_3 + _loc_12;
_loc_4 = _loc_4 + _loc_13;
_loc_5 = _loc_5 + _loc_14;
_loc_6 = _loc_6 + _loc_15;
_loc_9 = _loc_9 + 16;
//trace("_loc_9=="+_loc_9+",_loc_7="+_loc_7);
}
var _loc_10:Array = new Array();
//new Array().writeInt(_loc_2);
_loc_10.push(_loc_3);
_loc_10.push(_loc_4);
_loc_10.push(_loc_5);
_loc_10.push(_loc_6);
//_loc_10.position = 0;
//_-TP = new ByteArray();
//_-TP.writeBytes(_loc_10);
//_-TP.position = 0;
int1 = _loc_2;
int2 = _loc_3;
int3 = _loc_4;
int4 = _loc_5;
int5 = _loc_6;
trace(_loc_2+","+_loc_3+","+","+_loc_4+","+_loc_5+","+_loc_6);
return _loc_10;
}// end function
function getPastureKey(param1:Number):String{
var _loc_6:Number = 0;
var _loc_2:String = "97b2d!@0b8f1@&%#$xsf";
var _loc_3:String = _loc_2.substr(param1 % 10, 100);
var _loc_4:Array = encode(param1 + _loc_3);
var _loc_5:Array = encode2(_loc_4);
trace(int1+"===");
trace(int2+"===");
trace(int3+"===");
trace(int4+"===");
trace(int5+"===");
return method1(int1, true) + method1(int2, true) + method1(int3, true) + method1(int4, true) + method1(int5, true);
}
function method1(param1:Number, param2:Boolean) : String
{
var _loc_4:Number = 0;
var _loc_5:Number = 0;
var _loc_3:String = "";
if (param2)
{
_loc_4 = 0;
while (_loc_4 < 4)
{
_loc_3 = _loc_3 + (by.charAt(param1 >> (3 - _loc_4) * 8 + 4 & 15) + by.charAt(param1 >> (3 - _loc_4) * 8 & 15));
_loc_4++;
}
}
else
{
_loc_5 = 0;
while (_loc_5 < 4)
{
_loc_3 = _loc_3 + (by.charAt(param1 >> _loc_5 * 8 + 4 & 15) +by.charAt(param1 >> _loc_5 * 8 & 15));
_loc_5++;
}
}
return _loc_3;
}// end function
functionmv(param1:Number, param2:Number) : Number
{
var aa = param1 << param2 | param1 >>> (32 - param2);
//trace(param1+"========="+param2+"======aa============="+aa);
return aa;
}// end function
var by:String = "0123456789abcdef";
function encode(param1:String) : Array
{
var _loc_2:Array = new Array();
var _loc_3:Number = param1.length * 8;
var _loc_4:Number = 255;
var _loc_5:Number = 0;
while (_loc_5 < _loc_3)
{
//trace((_loc_5>>5)+"=loc5");
var a =_loc_2;
var b = (param1.charCodeAt(_loc_5 / 8) & _loc_4);
_loc_2 = (a | b << (24 - _loc_5 % 32));
_loc_5 = _loc_5 + 8;
}
_loc_2 = _loc_2 | 128 << 24 - _loc_3 % 32;
_loc_2[(_loc_3 + 64 >> 9 << 4) + 15] = _loc_3;
return _loc_2;
}// end function
function f(param1:Number, param2:Number, param3:Number, param4:Number) : Number
{
if (param1 < 20)
{
return param2 & param3 | ~param2 & param4;
}
if (param1 < 40)
{
return param2 ^ param3 ^ param4;
}
if (param1 < 60)
{
return param2 & param3 | param2 & param4 | param3 & param4;
}
return param2 ^ param3 ^ param4;
}// end function
function Uz(param1:Number) : Number
{
if (param1 < 20)
{
return 1518500249;
}
if (param1 < 40)
{
return 1859775393;
}
if (param1 < 60)
{
return 2400959708;
}
return 3395469782;
}// end function
var int1;
var int2;
var int3;
var int4;
var int5;
function encode2(param1:Array) : Array
{
var _loc_11:Number = 0;
var _loc_12:Number = 0;
var _loc_13:Number = 0;
var _loc_14:Number = 0;
var _loc_15:Number = 0;
var _loc_16:Number = 0;
var _loc_17:Number = 0;
var _loc_2:Number = 1732584193;
var _loc_3:Number = 4023233417;
var _loc_4:Number = 2562383102;
var _loc_5:Number = 271733878;
var _loc_6:Number = 3285377520;
var _loc_7:Number = param1.length;
var _loc_8:Array = new Array(80);
var _loc_9:Number = 0;
while (_loc_9 < _loc_7)
{
_loc_11 = _loc_2;
_loc_12 = _loc_3;
_loc_13 = _loc_4;
_loc_14 = _loc_5;
_loc_15 = _loc_6;
_loc_16 = 0;
while (_loc_16 < 80)
{
if (_loc_16 < 16)
{
_loc_8 = param1;
//trace(_loc_2+"<>"+_loc_17);
}
else
{
var bb = _loc_8 ^ _loc_8 ^ _loc_8 ^ _loc_8;
_loc_8 = mv(bb, 1);
}
var cc = f(_loc_16, _loc_12, _loc_13, _loc_14) ;
var dd = Uz(_loc_16);
//trace("cc["+cc+"]dd["+dd+"]");
_loc_17 = mv(_loc_11, 5) + cc + _loc_15 + int(_loc_8) + dd;
//trace("_loc_17="+_loc_17);
_loc_15 = _loc_14;
_loc_14 = _loc_13;
_loc_13 = mv(_loc_12, 30);
trace(_loc_16+","+_loc_12+","+_loc_13+","+_loc_14+",_loc_12="+_loc_12);
_loc_12 = _loc_11;
_loc_11 = _loc_17;
_loc_16++;
}
_loc_2 = _loc_2 + _loc_11;
_loc_3 = _loc_3 + _loc_12;
_loc_4 = _loc_4 + _loc_13;
_loc_5 = _loc_5 + _loc_14;
_loc_6 = _loc_6 + _loc_15;
_loc_9 = _loc_9 + 16;
//trace("_loc_9=="+_loc_9+",_loc_7="+_loc_7);
}
var _loc_10:Array = new Array();
//new Array().writeInt(_loc_2);
_loc_10.push(_loc_3);
_loc_10.push(_loc_4);
_loc_10.push(_loc_5);
_loc_10.push(_loc_6);
//_loc_10.position = 0;
//_-TP = new ByteArray();
//_-TP.writeBytes(_loc_10);
//_-TP.position = 0;
int1 = _loc_2;
int2 = _loc_3;
int3 = _loc_4;
int4 = _loc_5;
int5 = _loc_6;
trace(_loc_2+","+_loc_3+","+","+_loc_4+","+_loc_5+","+_loc_6);
return _loc_10;
}// end function
function getPastureKey(param1:Number):String{
var _loc_6:Number = 0;
var _loc_2:String = "97b2d!@0b8f1@&%#$xsf";
var _loc_3:String = _loc_2.substr(param1 % 10, 100);
var _loc_4:Array = encode(param1 + _loc_3);
var _loc_5:Array = encode2(_loc_4);
trace(int1+"===");
trace(int2+"===");
trace(int3+"===");
trace(int4+"===");
trace(int5+"===");
return method1(int1, true) + method1(int2, true) + method1(int3, true) + method1(int4, true) + method1(int5, true);
}
function method1(param1:Number, param2:Boolean) : String
{
var _loc_4:Number = 0;
var _loc_5:Number = 0;
var _loc_3:String = "";
if (param2)
{
_loc_4 = 0;
while (_loc_4 < 4)
{
_loc_3 = _loc_3 + (by.charAt(param1 >> (3 - _loc_4) * 8 + 4 & 15) + by.charAt(param1 >> (3 - _loc_4) * 8 & 15));
_loc_4++;
}
}
else
{
_loc_5 = 0;
while (_loc_5 < 4)
{
_loc_3 = _loc_3 + (by.charAt(param1 >> _loc_5 * 8 + 4 & 15) +by.charAt(param1 >> _loc_5 * 8 & 15));
_loc_5++;
}
}
return _loc_3;
}// end function
functionmv(param1:Number, param2:Number) : Number
{
var aa = param1 << param2 | param1 >>> (32 - param2);
//trace(param1+"========="+param2+"======aa============="+aa);
return aa;
}// end function
as代码都找到了,然后把它翻译成c#或java,即可:
c#代码结果:
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace com.sourceware.util
{
class PastureKey
{
public static string getPastureKey(int farmTime)
{
string _loc_2 = "97b2d!@0b8f1@&%#$xsf";
string _loc_3 = _loc_2.Substring(farmTime % 10, _loc_2.Length - farmTime % 10);
int[] _loc_4 = m1(farmTime + _loc_3);
ArrayList all =encode2(_loc_4, 16);
return method1((Int64)all, true) + method1((Int64)all, true) + method1((Int64)all, true) + method1((Int64)all, true) + method1((Int64)all, true);
}
private static int[] m1(string param1)
{
int[] _loc_2 = new int;
int _loc_3 = param1.Length * 8;
int _loc_4 = 255;
int _loc_5 = 0;
while (_loc_5 < _loc_3)
{
var a = _loc_2;
var b = (char.Parse(param1.Substring(_loc_5 / 8, 1)) & _loc_4);
_loc_2 = (a | b << (24 - _loc_5 % 32));
_loc_5 = _loc_5 + 8;
}
_loc_2 = _loc_2 | 128 << 24 - _loc_3 % 32;
_loc_2[(_loc_3 + 64 >> 9 << 4) + 15] = _loc_3;
return _loc_2;
}// end function
private static System.Collections.ArrayList encode2(int[] param1, int len)
{
Int64 _loc_11 = 0;
Int64 _loc_12 = 0;
Int64 _loc_13 = 0;
Int64 _loc_14 = 0;
Int64 _loc_15 = 0;
int _loc_16 = 0;
Int64 _loc_17 = 0;
Int64 _loc_2 = 1732584193;
Int64 _loc_3 = 4023233417;
Int64 _loc_4 = 2562383102;
Int64 _loc_5 = 271733878;
Int64 _loc_6 = 3285377520;
int _loc_7 = len;
Int64[] _loc_8 = new Int64;
int _loc_9 = 0;
while (_loc_9 < _loc_7)
{
_loc_11 = _loc_2;
_loc_12 = _loc_3;
_loc_13 = _loc_4;
_loc_14 = _loc_5;
_loc_15 = _loc_6;
_loc_16 = 0;
while (_loc_16 < 80)
{
if (_loc_16 < 16)
{
_loc_8 = param1;
//System.Console.WriteLine(_loc_2 + "<>" + _loc_17);
}
else
{
Int64 bb = _loc_8 ^ _loc_8 ^ _loc_8 ^ _loc_8;
_loc_8 = mv(bb, 1);
System.Console.WriteLine("bb[" + bb + "]result[" + mv(bb, 1) + "]");
}
Int64 cc = f((Int64)_loc_16, (Int64)_loc_12, (Int64)_loc_13, (Int64)_loc_14);
//System.Console.WriteLine(_loc_16 + "," + _loc_12 + "," + _loc_13 + "," + _loc_14 + ",cc=" + cc);
Int64 dd = Uz(_loc_16);
//System.Console.WriteLine("cc[" + cc + "]dd[" + dd + "]");
_loc_17 = mv(_loc_11, 5) + cc + _loc_15 + _loc_8 + dd;
//System.Console.WriteLine("[" + mv(_loc_11, 5) + "][" + (int)cc + "][" + _loc_15 + "][" + _loc_8 + "][" + dd + "]");
_loc_15 = _loc_14;
_loc_14 = _loc_13;
_loc_13 = mv(_loc_12, 30);
//System.Console.WriteLine("13=" + _loc_13 + ",12=" + _loc_12);
_loc_12 = _loc_11;
_loc_11 = _loc_17;
_loc_16++;
}
_loc_2 = (_loc_2 + _loc_11);
_loc_3 = (_loc_3 + _loc_12);
_loc_4 = (_loc_4 + _loc_13);
_loc_5 = (_loc_5 + _loc_14);
_loc_6 = _loc_6 + _loc_15;
_loc_9 = _loc_9 + 16;
}
ArrayList _loc_10 = new ArrayList();
_loc_10.Add(_loc_2);
_loc_10.Add(_loc_3);
_loc_10.Add(_loc_4);
_loc_10.Add(_loc_5);
_loc_10.Add(_loc_6);
return _loc_10;
}// end function
public static Int64 f(Int64 param1, Int64 param2, Int64 param3, Int64 param4)
{
int a = (int)param1;
int b = (int)param2;
int c = (int)param3;
int d = (int)param4;
if (a < 20)
{
return b & c | ~b & d;
}
if (a < 40)
{
return b ^ c ^ d;
}
if (a < 60)
{
return b & c | b & d | c & d;
}
return b ^ c ^ d;
}// end function
private static Int64 Uz(Int64 param1)
{
if (param1 < 20)
{
return 1518500249;
}
if (param1 < 40)
{
return 1859775393;
}
if (param1 < 60)
{
return 2400959708;
}
return 3395469782;
}// end function
public static Int64 mv(Int64 param1, int param2)
{
int aa = (int)param1 << (int)param2;
uint bb = (uint)((uint)param1 >> (32 - param2));
Int64 cc = (Int64)(aa | bb);
return cc;
}// end function
private static string method1(Int64 param1, bool param2)
{
string by = "0123456789abcdef";
int _loc_4 = 0;
int _loc_5 = 0;
string _loc_3 = "";
if (param2)
{
_loc_4 = 0;
while (_loc_4 < 4)
{
_loc_3 = _loc_3 + (by.Substring((int)(param1 >> (3 - _loc_4) * 8 + 4 & 15), 1) + by.Substring((int)(param1 >> (3 - _loc_4) * 8 & 15), 1));
_loc_4++;
}
}
else
{
_loc_5 = 0;
while (_loc_5 < 4)
{
_loc_3 = _loc_3 + (by.Substring((int)(param1 >> _loc_5 * 8 + 4 & 15), 1) + by.Substring((int)(param1 >> _loc_5 * 8 & 15), 1));
_loc_5++;
}
}
return _loc_3;
}// end function
}//end class
}
ddddddddddddddddddd 学习中,呵呵 :)
這麼長的算法啊 学习,自己也来做做。 太复杂的算法,,,头晕。 我回来了我要回复一下 学习下。。谢谢 很想看。。。
页:
[1]