/**
 * rsa 加密算法实现
 */
var biRadixBase = 2;
var biRadixBits = 16;
var bitsPerDigit = biRadixBits;
var biRadix = 1 << 16;
var biHalfRadix = biRadix >>> 1;
var biRadixSquared = biRadix * biRadix;
var maxDigitVal = biRadix - 1;
var maxInteger = 9999999999999998;
var maxDigits;
var ZERO_ARRAY;
var bigZero, bigOne;
function setMaxDigits(_4c4){
	maxDigits = _4c4;
	ZERO_ARRAY = new Array(maxDigits);
	for(var iza = 0; iza < ZERO_ARRAY.length; iza++){
		ZERO_ARRAY[iza] = 0;
	}
	bigZero = new BigInt();
	bigOne = new BigInt();
	bigOne.digits[0] = 1;
}
setMaxDigits(20);
var dpl10 = 15;
var lr10 = biFromNumber(1000000000000000);
function BigInt(flag){
	if(typeof flag == "boolean" && flag == true){
		this.digits = null;
	}else{
		this.digits = ZERO_ARRAY.slice(0);
	}
	this.isNeg = false;
}
function biFromDecimal(s){
	var _4c8 = s.charAt(0) == "-";
	var i = _4c8 ? 1 : 0;
	var _4ca;
	while(i < s.length && s.charAt(i) == "0"){
		++i;
	}
	if(i == s.length){
		_4ca = new BigInt();
	}else{
		var _4cb = s.length - i;
		var fgl = _4cb % dpl10;
		if(fgl == 0){
			fgl = dpl10;
		}
		_4ca = biFromNumber(Number(s.substr(i, fgl)));
		i += fgl;
		while(i < s.length){
			_4ca = biAdd(biMultiply(_4ca, lr10), biFromNumber(Number(s.substr(i, dpl10))));
			i += dpl10;
		}
		_4ca.isNeg = _4c8;
	}
	return _4ca;
}
function biCopy(bi){
	var _4ce = new BigInt(true);
	_4ce.digits = bi.digits.slice(0);
	_4ce.isNeg = bi.isNeg;
	return _4ce;
}
function biFromNumber(i){
	var _4d0 = new BigInt();
	_4d0.isNeg = i < 0;
	i = Math.abs(i);
	var j = 0;
	while(i > 0){
		_4d0.digits[j++] = i & maxDigitVal;
		i = Math.floor(i / biRadix);
	}
	return _4d0;
}
function reverseStr(s){
	var _4d3 = "";
	for(var i = s.length - 1; i > -1; --i){
		_4d3 += s.charAt(i);
	}
	return _4d3;
}
var hexatrigesimalToChar = new Array(
	"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
	"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
	"k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
	"u", "v", "w", "x", "y", "z");
function biToString(x, _4d6){
	var b = new BigInt();
	b.digits[0] = _4d6;
	var qr = biDivideModulo(x, b);
	var _4d9 = hexatrigesimalToChar[qr[1].digits[0]];
	while(biCompare(qr[0], bigZero) == 1){
		qr = biDivideModulo(qr[0], b);
		digit = qr[1].digits[0];
		_4d9 += hexatrigesimalToChar[qr[1].digits[0]];
	}
	return (x.isNeg ? "-" : "") + reverseStr(_4d9);
}
function biToDecimal(x){
	var b = new BigInt();
	b.digits[0] = 10;
	var qr = biDivideModulo(x, b);
	var _4dd = String(qr[1].digits[0]);
	while(biCompare(qr[0], bigZero) == 1){
		qr = biDivideModulo(qr[0], b);
		_4dd += String(qr[1].digits[0]);
	}
	return (x.isNeg ? "-" : "") + reverseStr(_4dd);
}
var hexToChar = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f");
function digitToHex(n){
	var mask = 15;
	var _4e0 = "";
	for(i = 0; i < 4; ++i){
		_4e0 += hexToChar[n & mask];
		n >>>= 4;
	}
	return reverseStr(_4e0);
}
function biToHex(x){
	var _4e2 = "";
	var n = biHighIndex(x);
	for(var i = biHighIndex(x); i > -1; --i){
		_4e2 += digitToHex(x.digits[i]);
	}
	return _4e2;
}
function charToHex(c){
	var ZERO = 48;
	var NINE = ZERO + 9;
	var _4e8 = 97;
	var _4e9 = _4e8 + 25;
	var bigA = 65;
	var bigZ = 65 + 25;
	var _4ec;
	if(c >= ZERO && c <= NINE){
		_4ec = c - ZERO;
	}else{
		if(c >= bigA && c <= bigZ){
			_4ec = 10 + c - bigA;
		}else{
			if(c >= _4e8 && c <= _4e9){
				_4ec = 10 + c - _4e8;
			}else{
				_4ec = 0;
			}
		}
	}
	return _4ec;
}
function hexToDigit(s){
	var _4ee = 0;
	var sl = Math.min(s.length, 4);
	for(var i = 0; i < sl; ++i){
		_4ee <<= 4;
		_4ee |= charToHex(s.charCodeAt(i));
	}
	return _4ee;
}
function biFromHex(s){
	var _4f2 = new BigInt();
	var sl = s.length;
	for(var i = sl, j = 0; i > 0; i -= 4, ++j){
		_4f2.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4)));
	}
	return _4f2;
}
function biFromString(s, _4f6){
	var _4f7 = s.charAt(0) == "-";
	var _4f8 = _4f7 ? 1 : 0;
	var _4f9 = new BigInt();
	var _4fa = new BigInt();
	_4fa.digits[0] = 1;
	for(var i = s.length - 1; i >= _4f8; i--){
		var c = s.charCodeAt(i);
		var _4fd = charToHex(c);
		var _4fe = biMultiplyDigit(_4fa, _4fd);
		_4f9 = biAdd(_4f9, _4fe);
		_4fa = biMultiplyDigit(_4fa, _4f6);
	}
	_4f9.isNeg = _4f7;
	return _4f9;
}
function biDump(b){
	return (b.isNeg ? "-" : "") + b.digits.join(" ");
}
function biAdd(x, y){
	var _502;
	if(x.isNeg != y.isNeg){
		y.isNeg = !y.isNeg;
		_502 = biSubtract(x, y);
		y.isNeg = !y.isNeg;
	}else{
		_502 = new BigInt();
		var c = 0;
		var n;
		for(var i = 0; i < x.digits.length; ++i){
			n = x.digits[i] + y.digits[i] + c;
			_502.digits[i] = n % biRadix;
			c = Number(n >= biRadix);
		}
		_502.isNeg = x.isNeg;
	}
	return _502;
}
function biSubtract(x, y){
	var _508;
	if(x.isNeg != y.isNeg){
		y.isNeg = !y.isNeg;
		_508 = biAdd(x, y);
		y.isNeg = !y.isNeg;
	}else{
		_508 = new BigInt();
		var n, c;
		c = 0;
		for(var i = 0; i < x.digits.length; ++i){
			n = x.digits[i] - y.digits[i] + c;
			_508.digits[i] = n % biRadix;
			if(_508.digits[i] < 0){
				_508.digits[i] += biRadix;
			}
			c = 0 - Number(n < 0);
		}
		if(c == -1){
			c = 0;
			for(var i = 0; i < x.digits.length; ++i){
				n = 0 - _508.digits[i] + c;
				_508.digits[i] = n % biRadix;
				if(_508.digits[i] < 0){
					_508.digits[i] += biRadix;
				}
				c = 0 - Number(n < 0);
			}
			_508.isNeg = !x.isNeg;
		}else{
			_508.isNeg = x.isNeg;
		}
	}
	return _508;
}
function biHighIndex(x){
	var _50c = x.digits.length - 1;
	while(_50c > 0 && x.digits[_50c] == 0){
		--_50c;
	}
	return _50c;
}
function biNumBits(x){
	var n = biHighIndex(x);
	var d = x.digits[n];
	var m = (n + 1) * bitsPerDigit;
	var _511;
	for(_511 = m; _511 > m - bitsPerDigit; --_511){
		if((d & 32768) != 0){
			break;
		}
		d <<= 1;
	}
	return _511;
}
function biMultiply(x, y){
	var _514 = new BigInt();
	var c;
	var n = biHighIndex(x);
	var t = biHighIndex(y);
	var u, uv, k;
	for(var i = 0; i <= t; ++i){
		c = 0;
		k = i;
		for(j = 0; j <= n; ++j, ++k){
			uv = _514.digits[k] + x.digits[j] * y.digits[i] + c;
			_514.digits[k] = uv & maxDigitVal;
			c = uv >>> biRadixBits;
		}
		_514.digits[i + n + 1] = c;
	}
	_514.isNeg = x.isNeg != y.isNeg;
	return _514;
}
function biMultiplyDigit(x, y){
	var n, c, uv;
	result = new BigInt();
	n = biHighIndex(x);
	c = 0;
	for(var j = 0; j <= n; ++j){
		uv = result.digits[j] + x.digits[j] * y + c;
		result.digits[j] = uv & maxDigitVal;
		c = uv >>> biRadixBits;
	}
	result.digits[1 + n] = c;
	return result;
}
function arrayCopy(src, _51f, dest, _521, n){
	var m = Math.min(_51f + n, src.length);
	for(var i = _51f, j = _521; i < m; ++i, ++j){
		dest[j] = src[i];
	}
}
var highBitMasks = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535);
function biShiftLeft(x, n){
	var _527 = Math.floor(n / bitsPerDigit);
	var _528 = new BigInt();
	arrayCopy(x.digits, 0, _528.digits, _527, _528.digits.length - _527);
	var bits = n % bitsPerDigit;
	var _52a = bitsPerDigit - bits;
	for(var i = _528.digits.length - 1, i1 = i - 1; i > 0; --i, --i1){
		_528.digits[i] = ((_528.digits[i] << bits) & maxDigitVal) | ((_528.digits[i1] & highBitMasks[bits]) >>> (_52a));
	}
	_528.digits[0] = ((_528.digits[i] << bits) & maxDigitVal);
	_528.isNeg = x.isNeg;
	return _528;
}
var lowBitMasks = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535);
function biShiftRight(x, n){
	var _52e = Math.floor(n / bitsPerDigit);
	var _52f = new BigInt();
	arrayCopy(x.digits, _52e, _52f.digits, 0, x.digits.length - _52e);
	var bits = n % bitsPerDigit;
	var _531 = bitsPerDigit - bits;
	for(var i = 0, i1 = i + 1; i < _52f.digits.length - 1; ++i, ++i1){
		_52f.digits[i] = (_52f.digits[i] >>> bits) | ((_52f.digits[i1] & lowBitMasks[bits]) << _531);
	}
	_52f.digits[_52f.digits.length - 1] >>>= bits;
	_52f.isNeg = x.isNeg;
	return _52f;
}
function biMultiplyByRadixPower(x, n){
	var _535 = new BigInt();
	arrayCopy(x.digits, 0, _535.digits, n, _535.digits.length - n);
	return _535;
}
function biDivideByRadixPower(x, n){
	var _538 = new BigInt();
	arrayCopy(x.digits, n, _538.digits, 0, _538.digits.length - n);
	return _538;
}
function biModuloByRadixPower(x, n){
	var _53b = new BigInt();
	arrayCopy(x.digits, 0, _53b.digits, 0, n);
	return _53b;
}
function biCompare(x, y){
	if(x.isNeg != y.isNeg){
		return 1 - 2 * Number(x.isNeg);
	}
	for(var i = x.digits.length - 1; i >= 0; --i){
		if(x.digits[i] != y.digits[i]){
			if(x.isNeg){
				return 1 - 2 * Number(x.digits[i] > y.digits[i]);
			}else{
				return 1 - 2 * Number(x.digits[i] < y.digits[i]);
			}
		}
	}
	return 0;
}
function biDivideModulo(x, y){
	var nb = biNumBits(x);
	var tb = biNumBits(y);
	var _543 = y.isNeg;
	var q, r;
	if(nb < tb){
		if(x.isNeg){
			q = biCopy(bigOne);
			q.isNeg = !y.isNeg;
			x.isNeg = false;
			y.isNeg = false;
			r = biSubtract(y, x);
			x.isNeg = true;
			y.isNeg = _543;
		}else{
			q = new BigInt();
			r = biCopy(x);
		}
		return new Array(q, r);
	}
	q = new BigInt();
	r = x;
	var t = Math.ceil(tb / bitsPerDigit) - 1;
	var _546 = 0;
	while(y.digits[t] < biHalfRadix){
		y = biShiftLeft(y, 1);
		++_546;
		++tb;
		t = Math.ceil(tb / bitsPerDigit) - 1;
	}
	r = biShiftLeft(r, _546);
	nb += _546;
	var n = Math.ceil(nb / bitsPerDigit) - 1;
	var b = biMultiplyByRadixPower(y, n - t);
	while(biCompare(r, b) != -1){
		++q.digits[n - t];
		r = biSubtract(r, b);
	}
	for(var i = n; i > t; --i){
		var ri = (i >= r.digits.length) ? 0 : r.digits[i];
		var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1];
		var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2];
		var yt = (t >= y.digits.length) ? 0 : y.digits[t];
		var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1];
		if(ri == yt){
			q.digits[i - t - 1] = maxDigitVal;
		}else{
			q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt);
		}
		var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1);
		var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2);
		while(c1 > c2){
			--q.digits[i - t - 1];
			c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1);
			c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2);
		}
		b = biMultiplyByRadixPower(y, i - t - 1);
		r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1]));
		if(r.isNeg){
			r = biAdd(r, b);
			--q.digits[i - t - 1];
		}
	}
	r = biShiftRight(r, _546);
	q.isNeg = x.isNeg != _543;
	if(x.isNeg){
		if(_543){
			q = biAdd(q, bigOne);
		}else{
			q = biSubtract(q, bigOne);
		}
		y = biShiftRight(y, _546);
		r = biSubtract(y, r);
	}
	if(r.digits[0] == 0 && biHighIndex(r) == 0){
		r.isNeg = false;
	}
	return new Array(q, r);
}
function biDivide(x, y){
	return biDivideModulo(x, y)[0];
}
function biModulo(x, y){
	return biDivideModulo(x, y)[1];
}
function biMultiplyMod(x, y, m){
	return biModulo(biMultiply(x, y), m);
}
function biPow(x, y){
	var _55a = bigOne;
	var a = x;
	while(true){
		if((y & 1) != 0){
			_55a = biMultiply(_55a, a);
		}
		y >>= 1;
		if(y == 0){
			break;
		}
		a = biMultiply(a, a);
	}
	return _55a;
}
function biPowMod(x, y, m){
	var _55f = bigOne;
	var a = x;
	var k = y;
	while(true){
		if((k.digits[0] & 1) != 0){
			_55f = biMultiplyMod(_55f, a, m);
		}
		k = biShiftRight(k, 1);
		if(k.digits[0] == 0 && biHighIndex(k) == 0){
			break;
		}
		a = biMultiplyMod(a, a, m);
	}
	return _55f;
}
function BarrettMu(m){
	this.modulus = biCopy(m);
	this.k = biHighIndex(this.modulus) + 1;
	var b2k = new BigInt();
	b2k.digits[2 * this.k] = 1;
	this.mu = biDivide(b2k, this.modulus);
	this.bkplus1 = new BigInt();
	this.bkplus1.digits[this.k + 1] = 1;
	this.modulo = BarrettMu_modulo;
	this.multiplyMod = BarrettMu_multiplyMod;
	this.powMod = BarrettMu_powMod;
}
function BarrettMu_modulo(x){
	var q1 = biDivideByRadixPower(x, this.k - 1);
	var q2 = biMultiply(q1, this.mu);
	var q3 = biDivideByRadixPower(q2, this.k + 1);
	var r1 = biModuloByRadixPower(x, this.k + 1);
	var _569 = biMultiply(q3, this.modulus);
	var r2 = biModuloByRadixPower(_569, this.k + 1);
	var r = biSubtract(r1, r2);
	if(r.isNeg){
		r = biAdd(r, this.bkplus1);
	}
	var _56c = biCompare(r, this.modulus) >= 0;
	while(_56c){
		r = biSubtract(r, this.modulus);
		_56c = biCompare(r, this.modulus) >= 0;
	}
	return r;
}
function BarrettMu_multiplyMod(x, y){
	var xy = biMultiply(x, y);
	return this.modulo(xy);
}
function BarrettMu_powMod(x, y){
	var _572 = new BigInt();
	_572.digits[0] = 1;
	var a = x;
	var k = y;
	while(true){
		if((k.digits[0] & 1) != 0){
			_572 = this.multiplyMod(_572, a);
		}
		k = biShiftRight(k, 1);
		if(k.digits[0] == 0 && biHighIndex(k) == 0){
			break;
		}
		a = this.multiplyMod(a, a);
	}
	return _572;
}
function RSAKeyPair(_575, _576, _577){
	this.e = biFromHex(_575);
	this.d = biFromHex(_576);
	this.m = biFromHex(_577);
	this.chunkSize = 2 * biHighIndex(this.m);
	this.radix = 16;
	this.barrett = new BarrettMu(this.m);
}
function twoDigit(n){
	return (n < 10 ? "0" : "") + String(n);
}
function encryptedString(key, s){
	var a = [];
	var sl = s.length;
	var i = 0;
	while(i < sl){
		a[i] = s.charCodeAt(i);
		i++;
	}
	while(a.length % key.chunkSize != 0){
		a[i++] = 0;
	}
	var al = a.length;
	var _57f = "";
	var j, k, block;
	for(i = 0; i < al; i += key.chunkSize){
		block = new BigInt();
		j = 0;
		for(k = i; k < i + key.chunkSize; ++j){
			block.digits[j] = a[k++];
			block.digits[j] += a[k++] << 8;
		}
		var _585 = key.barrett.powMod(block, key.e);
		var _589 = new RSAKeyPair("10001", "", "2d8591cf12cb2e8800befddb75871bd1253ea1a20172784e8e0c73dba381d0702c40750c6a01d8abfb4133ae51d69cd19b53d7798475de89272cfde4d05ff3c648f0a26c786efb1e699ed3c3affa2250ef5d83088e6d902c1c692ce9fd9a1a31d1b8e6bfc37142f536e690f66a15956ad6ea07066d88773a091c4744b02c487d");
		var text = key.radix == 16 ? biToHex(_585) : biToString(_585, key.radix);
		_57f += text + " ";
	}
	return _57f.substring(0, _57f.length - 1);
}
function rsaEncrypt(data){
	if(!data) return "";
	var t1 = new Date().getTime();
	setMaxDigits(160);
	//var _589 = new RSAKeyPair("25", "", "00846e46d25bc8743ac45c12c5ae9acbdb1ae2d632d9fdda3bc50ad0c02afbb3060ac5350af7d774014e4c01feef522edbc8f68d3b066025066b78e3de201fa2ec5e0f2006599c9f993ca18316ee940be6f7185b2fbd797fb692740da782e0c41b33e8b2dcb392f93b650526a4470ea9b6ae510dc6c84a69f0b1f27b3dbb43f615");
	var _589 = new RSAKeyPair("10001", "", "2d8591cf12cb2e8800befddb75871bd1253ea1a20172784e8e0c73dba381d0702c40750c6a01d8abfb4133ae51d69cd19b53d7798475de89272cfde4d05ff3c648f0a26c786efb1e699ed3c3affa2250ef5d83088e6d902c1c692ce9fd9a1a31d1b8e6bfc37142f536e690f66a15956ad6ea07066d88773a091c4744b02c487d");
	var ret = encryptedString(_589, data);
	//application.log("rsaEncrypt took " + (new Date().getTime() - t1) + " ms");
	return ret;
}
