flex 文件
package
{
import mx.controls.Alert;
private class BigInteger(
var dbits = 30;
var canary:Number = 0xdeadbeefcafe;
var j_lm:Boolean = ((canary & 0xffffff)==0xefcafe);
dbits = 30
var BI_FP:Number = 52;
public var DB:Number = dbits;
public var DM:Number = ((1 Array,j:Number,c:Number,n:N umber) :Number{
var xl:Number = x&0x7fff, xh:Number = x>>15;
while(--n >= 0) {
var l:Number = this[i]&0x7fff;
var h:Number = this[i++]>>15;
var m:Number = xh*l+h*xl;
l = xl*l+((m&0x7fff)>>30)+(m>>>15)+xh*h+(c>>>30);
w[j++] = l&0x3fffffff; }
return c; }
public function copyTo(r:Object):void {
for(var i:Number = this.t-1; i >= 0; --i)
r[i] = this[i];
r.t = this.t;
r.s = this.s;
}
public function fromInt(x:Number):void {
this.t = 1;
this.s = (x 0) this[0] = x;
else if(x = 0) {
var x = (k==8)?s[i]&0xff:intAt(s,i);
if(x this.DB) {
this[this.t-1] |= (x&((1>(this.DB-sh));
}
else
this[this.t-1] |= x= this.DB) sh -= this.DB;
}
if(k == 8 && (s[0]&0x80) != 0) {
this.s = -1;
if(sh > 0) this[this.t-1] |= ((1 0 && this[this.t-1] == c) --this.t;
}
public function dlShiftTo(n:Number,r:Array):void {
var i:Number;
for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
for(i = n-1; i >= 0; --i) r[i] = 0;
r.t = this.t+n;
r.s = this.s;
}
public function drShiftTo(n:Number,r):void {
for(var i = n; i = 0; --i) {
r[i+ds+1] = (this[i]>>cbs)|c;
c = (this[i]&bm)= 0; --i) r[i] = 0;
r[ds] = c;
r.t = this.t+ds+1;
r.s = this.s;
r.clamp();
}
public function rShiftTo(n,r):void {
r.s = this.s;
var ds:Number = Math.floor(n/this.DB);
if(ds >= this.t) { r.t = 0; return; }
var bs:Number = n%this.DB;
var cbs:Number = this.DB-bs;
var bm :Number = (1>bs;
for(var i = ds+1; i >bs;
}
if(bs > 0) r[this.t-ds-1] |= (this.s&bm)>= this.DB;
}
if(a.t >= this.DB;
}
c += this.s;
}
else {
c += this.s;
while(i >= this.DB;
}
c -= a.s;
}
r.s = (c 0) r[i++] = c;
r.t = i;
r.clamp();
}
public function multiplyTo(a:Number,r:Number) {
var x:BigInteger = this.abs(), y:Number = a.abs();
var i:Number = x.t;
r.t = i+y.t;
while(--i >= 0) r[i] = 0;
for(i = 0; i = 0) r[i] = 0;
for(i = 0; i = x.DV) {
r[i+x.t] -= x.DV;
r[i+x.t+1] = 1;
}
}
if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
r.s = 0;
r.clamp();
}
public function divRemTo(m,q,r):void {
var pm:BigInteger = m.abs();
if(pm.t 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
else { pm.copyTo(y); pt.copyTo(r); }
var ys :Number= y.t;
var y0:Number = y[ys-1];
if(y0 == 0) return;
var yt = y0*(11)?y[ys-2]>>this.F2:0);
var d1 = this.FV/yt, d2 = (1= 0) {
r[r.t++] = 1;
r.subTo(t,r);
}
BigInteger.ONE.dlShiftTo(ys,t);
t.subTo(y,y);
while(y.t = 0) {
var qd:Number = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e) *d2);
if((r[i]+=y.am(0,qd,r,j,0,ys)) 0) r.rShiftTo(nsh,r);
if(ts 0) a.subTo(r,r);
return r;
}
public function invDigit():Number {
if(this.t 0)?this.DV-y:-y;
}
public function isEven():Boolean { return ((this.t>0)?(this[0]&1):this.s) == 0; }
public function exp(e:Number,z:Montgomery):BigInteger {
if(e > 0xffffffff || e = 0) {
z.sqrTo(r,r2);
if((e&(1 0) z.mulTo(r2,g,r);
else { var t = r; r = r2; r2 = t; }
}
return z.revert(r);
}
public function toString(b) {
if(this.s 0) {
if(p >p) > 0) { m = true; r = int2char(d); }
while(i >= 0) {
if(p >(p+=this.DB-k);
}
else {
d = (this[i]>>(p-=k))&km;
if(p 0) m = true;
if(m) r += int2char(d);
}
}
return m?r:"0";
}
public function abs():BigInteger { return (this.s= 0) if((r=this[i]-a[i]) != 0) return r;
return 0;
}
public function bitLength():BigInteger {
if(this.t >>16) != 0) { x = t; r += 16; }
if((t=x>>8) != 0) { x = t; r += 8; }
if((t=x>>4) != 0) { x = t; r += 4; }
if((t=x>>2) != 0) { x = t; r += 2; }
if((t=x>>1) != 0) { x = t; r += 1; }
return r;
}
public function compareTo(a:BigInteger) {
var r = this.s-a.s;
if(r != 0) return r;
var i = this.t;
r = i-a.t;
if(r != 0) return r;
while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
return 0;
}
public function bitLength() {
if(this.t = 0) return x.mod(this.m);
else return x;
}
public function revert(x:Object):Object { return x; }
public function reduce(x:BigInteger):void { x.divRemTo(this.m, null,x); }
public function mulTo(x:BigInteger,y:BigInteger,r:BigInteger):void { x.multiplyTo(y,r); reduce(r); }
public function sqrTo(x:BigInteger,r:BigInteger):void { x.squareTo(r); reduce(r); }
} private class Montgomery{
private var m:BigInteger;
private var mp:Number;
private var mpl:Number;
private var mph:Number;
private var um:Number;
private var mt2:Number;
public function Montgomery(m:BigInteger){
this.m = m;
this.mp = m.invDigit();
this.mpl = this.mp&0x7fff;
this.mph = this.mp>>15;
this.um = (1 0) this.m.subTo(r,r);
return r;
}
public function revert(x:BigInteger):BigInteger {
var r:BigInteger = new BigInteger().nbi();
x.copyTo(r);
this.reduce(r);
return r;
}
public function reduce(x:BigInteger):void {
while(x.t >15)*this.mpl)&this. um)= x.DV) { x[j] -= x.DV; x[++j]++; }
}
x.clamp();
x.drShiftTo(this.m.t,x);
if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
}
public function sqrTo(x:BigInteger,r:BigInteger):void { x.squareTo(r); this.reduce(r); }
public function mulTo(x:BigInteger,y:BigInteger,r:BigInteger):void { x.multiplyTo(y,r); this.reduce(r); }
} private class Arcfour() {
private var i:Number = 0;
private var j:Number = 0;
private var S:Array = [];
public function init(key:Array):void {
var i:Number, j:Number, t:String;
for(i = 0; i Array {
var t:Number;
this.i = (this.i + 1) & 255;
this.j = (this.j + this.S[this.i]) & 255;
t = this.S[this.i];
this.S[this.i] = this.S[this.j];
this.S[this.j] = t;
return this.S[(t + this.S[this.i]) & 255];
}
}
/************************************************* *************************************************** **/
/************************************************* *************************************************** **/
var BI_RM:String = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC:Array = [];
var rr:String,vv:Number;
rr = String.fromCharCode('0');/**** "0".charCodeAt(0); ****/
for(vv = 0; vv > 6) + b64map.charAt(c & 63);
}
if(i+1 == h.length) {
c = parseInt(h.substring(i,i+1),16);
ret += b64map.charAt(c > 2) + b64map.charAt((c & 3) 0) ret += b64pad;
return ret;
}
function b64tohex(s:String):String {
var ret:String = ""
var i:Number;
var k:Number = 0;
var slop:Number;
for(i = 0; i > 2);
slop = v & 3;
k = 1;
}else if(k == 1) {
ret += int2char((slop > 4));
slop = v & 0xf;
k = 2;
}else if(k == 2) {
ret += int2char(slop);
ret += int2char(v >> 2);
slop = v & 3;
k = 3;
} else {
ret += int2char((slop > 4));
ret += int2char(v & 0xf);
k = 0;
}
}
if(k == 1)
ret += int2char(slop Array {
var h:String = b64tohex(s);
var i:Number;
var a:Array =[];
for(i = 0; 2*i Array;
var rng_pptr:Number = 0;
public function SecureRandom():void{
if(rng_pool == null) {
rng_pool = [];
rng_pptr = 0;
var t:Number;
while(rng_pptr >> 8;
rng_pool[rng_pptr++] = t & 255;
}
rng_pptr = 0;
rng_seed_time();
}
}
public function nextBytes(ba:Array):void {
var i:Number;
for(i = 0; i > & 255;
rng_pool[rng_pptr++] ^= (x >> 16) & 255;
rng_pool[rng_pptr++] ^= (x >> 24) & 255;
if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
} } public class RSAKey{
private var n:BigInteger = null;
private var e:BigInteger = 0;
private var d = null;
private var p = null;
private var q = null;
private var dmp1 = null;
private var dmq1 = null;
private var coeff = null;
public function setPublic(N:String,E:String) {
if(N != null && E != null && N.length > 0 && E.length > 0) {
this.n = parseBigInt(N,16);
this.e = parseInt(E,16);
} else
Alert.show("Invalid RSA public key");
}
public function doPublic(x:BigInteger):BigInteger {
return x.modPowInt(this.e, this.n);
}
public function encrypt(text:String):String {
var m :BigInteger = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null) return null;
var c:BigInteger = this.doPublic(m);
if(c == null) return null;
var h:String = c.toString(16).toUpperCase();
var gapLen:Number = 256 - h.length;
for(var i:Number = 0; i Array = [];
var i = s.length - 1;
var len = s.length;
if(len 0) {
ba[j++] = s.charCodeAt(i++);
}
var rng:SecureRandom = new SecureRandom();
var x:Array = [];
while(j<n) {
x[0] = 0;
while(x[0] == 0)
rng.nextBytes(x);
ba[j++] = x[0];
}
return new BigInteger(ba);
}
}
}
猜你喜欢
转载自auwg34auwg.iteye.com/blog/1573010
今日推荐
周排行