Цитата(AlDev @ 8.2.2006, 11:20 ) | ЗЫ:пригодится. Хэширование пароля для отправки:
|
у тя там ошибки причём куча.... вот испраленный и немного доработаный вариант...
| Код | package MySQL.Password {
import flash.util.trace;
public class Password { public function Password() { } public static function map(val:Array):String { trace("\nМетод map(val:Array)"); trace("Вход\n (val): " + val + "\n"); var ret:String = ""; for(var i:Number = 0; i < val.length; i++ ) ret += val[i].toString(); trace("Выход\n (string): " + ret + "\n"); return ret; } public function scramble(password:String, hash_seed:String, client_capabilities:Number):String { if (password.length == 0) { return ''; } var hsl:Number = hash_seed.length; var out:Array = new Array(); var hash_pass:Array = Password.get_hash(password); var hash_mess:Array = Password.get_hash(hash_seed); var max_value:Number = 0; var seed:Number = 0; var seed2:Number = 0; var dRes:Number = 0; var dSeed:Number = 0; var dMax:Number = 0; if (client_capabilities>1) { max_value = 0x01FFFFFF; seed = Password.xor_by_long(hash_pass[0],hash_mess[0])%max_value; seed2 = int(seed/2); }else { max_value = 0x3FFFFFFF; seed = Password.xor_by_long(hash_pass[0], hash_mess[0])%max_value; seed2 = Password.xor_by_long(hash_pass[1], hash_mess[1])%max_value; } dMax = max_value; var i:Number = 0; for (i=0;i<hsl;i++) { seed = int((seed+3+seed2)%max_value); seed2 = int((seed+seed2+33)%max_value); dSeed = seed; dRes = dSeed/dMax; out.push(int(dRes*31)+64); } if (client_capabilities == 1) { seed = (seed*3+seed2)%max_value; seed2 = (seed+seed2+33)%max_value; dSeed = seed; dRes = dSeed/dMax; var e:uint = int(dRes*31); for (i=0;i<hsl;i++) { out[i] ^= e; } } return Password.map(out); } public static function get_hash(pass:String):Array { trace("\nМетод get_hash(pass:String)"); trace("Вход\n (pass): " + pass + "\n"); var nr:Number = 1345345333; var ad:Number = 7; var nr2:Number = 0x12345671; var tmp:Number; var value:Number; var c:String; var pwd_len:Number = pass.length; for (var i:uint = 0;i<pwd_len;i++) { c = pass.charAt(i); if ((c == ' ')||(c == '\t')) { continue; } tmp = c.charCodeAt(0); value = ((Password.and_by_char(nr, 63) + ad) * tmp) + nr*256; nr = Password.xor_by_long(nr, value); nr2 += Password.xor_by_long((nr2*256),nr); ad += tmp; } return new Array(Password.and_by_long(nr, 0x7fffffff),Password.and_by_long(nr2, 0x7fffffff)); } public static function and_by_char(source:Number, mask:Number):Number { trace("\nМетод and_by_char(source:Number, mask:Number)"); trace("Вход \n (mask): " + mask + " (source): " + source + "\n"); return source & mask; } public static function and_by_long(source:Number, mask:Number):Number { trace("\nМетод and_by_long(source:Number, mask:Number)"); trace("Вход \n (mask): " + mask + " (source): " + source + "\n"); mask = mask || 0xFFFFFFFF; //trace("Взял (mask) " + mask + "\n"); return (Password.curr_off_to_long(source) & Password.curr_off_to_long(mask)); } public static function xor_by_long(source:Number, mask:Number):Number { trace("\nМетод xor_by_long(source:Number, mask:Number)"); trace("Вход \n (mask): " + mask + " (source): " + source + "\n"); mask = mask || 0; //trace("Взял (mask) " + mask + "\n"); return (Password.curr_off_to_long(source) ^ Password.curr_off_to_long(mask)); } protected static function curr_off_to_long(source:Number):Number { trace("\nМетод curr_off_to_long(source:Number)"); trace("Вход\n (source): " + source + "\n"); if (source >= 5.006) { if (source > 0xFFFFFFFF) { source = source % (0xFFFFFFFF + 1); } return source; } while (source > 0xFFFFFFFF) { source -= 0xFFFFFFFF + 1; } return source; } } }
|
|