近来一直研究谷歌地图,现求谷歌地图API KEY 加密函数如下面的getApiKey(),
下面找到一个getApiKey(),函数,但有错,麻烦大家帮修改一下,谢谢。
<script>
alert(getApiKey('ABQIAAAA4yrHaZj69wmUA_eR7szo7BSrN-IdsOr80FJn-Wy1HXRGqRu8lRTLbRxw9kCI8vBChoMsCq4VVhVW4A'))
function getApiKey(a)
        {
            var b=[1518500249,1859775393,2400959708,3395469782];
            a+=String.fromCharCode(128);
            var c=a.length;
            var d=ib(c/4)+2;
            var e=ib(d/16);
            var f=new Array(e);
            for(var g=0;g<e;g++)
            {
                f[g]=new Array(16);
                for(var h=0;h<16;h++)
                {
                    f[g][h]=a.charCodeAt(g*64+h*4)<<24|a.charCodeAt(g*64+h*4+1)<<16|a.charCodeAt(g*64+h*4+2)<<8|a.charCodeAt(g*64+h*4+3)
                }
            }
            f[e-1][14]=(c-1>>>30)*8;
            f[e-1][15]=(c-1)*8&4294967295;
            var i=1732584193;
            var l=4023233417;
            var n=2562383102;
            var p=271733878;
            var t=3285377520;
            var v=new Array(80);
            var z,
            y,B,F,T;
            for(var g=0;g<e;g++)
            {
                for(var M=0;M<16;M++)
                {
                    v[M]=f[g][M]
                }
                for(var M=16;M<80;M++)
                {
                    v[M]=yc(v[M-3]^v[M-8]^v[M-14]^v[M-16],1)
                }
                z=i;
                y=l;
                B=n;
                F=p;
                T=t;
                for(var M=0;M<80;M++)
                {
                    var ta=getMathFloor(M/20);
                    var bb=yc(z,5)+Sd(ta,y,B,F)+T+b[ta]+v[M]&4294967295;
                    T=F;
                    F=B;
                    B=yc(y,30);
                    y=z;
                    z=bb
                }
                i=i+z&4294967295;
                l=l+y&4294967295;
                n=n+B&4294967295;
                p=p+F&4294967295;
                t=t+T&4294967295
            }
            return Hb(i)+Hb(l)+Hb(n)+Hb(p)+Hb(t)
        }
        function Sd(a,b,c,d)
        {
            switch(a)
            {
                case 0:return b&c^~b&d;
                case 1:return b^c^d;
                case 2:return b&c^b&d^c&d;
                case 3:return b^c^d
            }
        }
        function yc(a,b)
        {
            return a<<b|a>>>32-b
        }
        function Hb(a)
        {
            var b="";
            for(var c=7;c>=0;c--)
            {
                var d=a>>>c*4&15;
                b+=d.toString(16)
            }
            return b
        };
        //这个是Google的一个网站列表,当然,只算那种国家域名的,很奇怪为什么没有Google.cn
        var googleSiteList=
        {
            co:
            {
                ck:1,cr:1,hu:1,id:1,il:1,"in":1,je:1,jp:1,ke:1,kr:1,ls:1,nz:1,th:1,ug:1,uk:1,ve:1,vi:1,za:1
            }
            ,com:
            {
                ag:1,ar:1,au:1,bo:1,br:1,bz:1,co:1,cu:1,"do":1,ec:1,fj:1,gi:1,gr:1,gt:1,hk:1,jm:1,ly:1,mt:1,mx:1,my:1,na:1,nf:1,ni:1,np:1,pa:1,pe:1,ph:1,pk:1,pr:1,py:1,sa:1,sg:1,sv:1,tr:1,tw:1,ua:1,uy:1,vc:1,vn:1
            }
            ,off:
            {
                ai:1
            }
        };
        //验证用户的key,参数是key
        function GValidateKey(a)
        {
            //验证是否是Google拥有的域名
            if(ValidateHost(window.location.host))
            {
                return true
            }
            //本地文件直接通过验证,便于调试
            if(window.location.protocol=="file:")
            {
                return true
            }
            var b=getLocationList(window.location.protocol,window.location.host,window.location.pathname)
            ;
            for(var c=0;c<b.length;++c)
            {
                var d=b[c];
                //通过网址生成key,只要有一个key对应,就可以验证通过
                var e=getApiKey(d);
                if(a==e)
                {
                    return true
                }
            }
            return false
        }
        function getLocationList(protocol,host,pathname)
        {
            var d=[];
            var e=[protocol];
            //如果使用https访问,则可以使用http的key
            if(protocol=="https:")
            {
                e.unshift("http:")
            }
            host=host.toLowerCase();
            var f=[host];
            var g=host.split(".");
            //网址前面的www有没有不影响key
            if(g[0]=="www")
            {
                g.shift()
            }
            else
            {
                g.unshift("www")
            }
            f.push(g.join("."));
            //规范path的格式
            pathname=pathname.split("/");
            var h=[];
            while(c.length>1)
            {
                c.pop();
                h.push(c.join("/")+"/")
            }
            for(var i=0;i<e.length;++i)
            {
                for(var l=0;l<f.length;++l)
                {
                    for(var n=0;n<h.length;++n)
                    {
                        //通过添加生成一个网址列表,可以用这个网址列表之中任何一个可能的key
                        d.push(e[i]+"//"+f[l]+h[n])
                    }
                }
            }
            return d
        }
        function ValidateHost(a)
        {
            var b=a.toLowerCase().split(".");
            //如果不是域名而是机器名,验证不通过
            if(b.length<2)
            {
                return false
            }
            //取域名的后两个单位
            var c=b.pop();
            var d=b.pop();
            //igoogle.com和gmodules.com直接验证通过
            if((d=="igoogle"||d=="gmodules")&&c=="com")
            {
                return true
            }
            //将Google的一些国家域名验证通过
            if(c.length==2&&b.length>0)
            {
                if(googleSiteList[d]&&googleSiteList[d][c]==1)
                {
                    d=b.pop()
                }
            }
            return d=="google"
        }
        //setWindows("GValidateKey",GValidateKey);
</script>