admin 发表于 2010-5-2 22:46:45

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   
}

wangfan778899 发表于 2010-5-9 18:25:02

ddddddddddddddddddd

501310440 发表于 2010-5-31 22:51:14

学习中,呵呵

bluefrankey 发表于 2010-6-2 00:57:57

:)
這麼長的算法啊

chinaxhb 发表于 2010-6-22 09:32:45

学习,自己也来做做。

avxs 发表于 2010-10-28 19:50:47

太复杂的算法,,,头晕。

coody 发表于 2010-11-9 12:11:31

我回来了我要回复一下

likess 发表于 2010-11-19 13:42:52

学习下。。谢谢

954624 发表于 2010-12-12 20:13:10

很想看。。。
页: [1]
查看完整版本: TX牧场出新加密算法PastureKey,c#实现方法