emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks
          javascript 版的 sha-1

           

          /*
           * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
           * in FIPS PUB 180-1
           * Copyright (C) Paul Johnston 2000 - 2002.
           * See http://pajhome.org.uk/site/legal.html for details.
           */

          /*
           * Convert a 32-bit number to a hex string with ms-byte first
           */
          var hex_chr = "0123456789abcdef";
          function hex(num)
          {
            var str = "";
            for(var j = 7; j >= 0; j--)
              str += hex_chr.charAt((num >> (j * 4)) & 0x0F);
            return str;
          }

          /*
           * Convert a string to a sequence of 16-word blocks, stored as an array.
           * Append padding bits and the length, as described in the SHA1 standard.
           */
          function str2blks_SHA1(str)
          {
            var nblk = ((str.length + 8) >> 6) + 1;
            var blks = new Array(nblk * 16);
            for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
            for(var i = 0; i < str.length; i++)
              blks[i >> 2] |= str.charCodeAt(i) << (24 - (i % 4) * 8);
            blks[i >> 2] |= 0x80 << (24 - (i % 4) * 8);
            blks[nblk * 16 - 1] = str.length * 8;
            return blks;
          }

          /*
           * Add integers, wrapping at 2^32. This uses 16-bit operations internally
           * to work around bugs in some JS interpreters.
           */
          function safe_add(x, y)
          {
            var lsw = (x & 0xFFFF) + (y & 0xFFFF);
            var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
            return (msw << 16) | (lsw & 0xFFFF);
          }

          /*
           * Bitwise rotate a 32-bit number to the left
           */
          function rol(num, cnt)
          {
            return (num << cnt) | (num >>> (32 - cnt));
          }

          /*
           * Perform the appropriate triplet combination function for the current
           * iteration
           */
          function ft(t, b, c, d)
          {
            if(t < 20) return (b & c) | ((~b) & d);
            if(t < 40) return b ^ c ^ d;
            if(t < 60) return (b & c) | (b & d) | (c & d);
            return b ^ c ^ d;
          }

          /*
           * Determine the appropriate additive constant for the current iteration
           */
          function kt(t)
          {
            return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
                   (t < 60) ? -1894007588 : -899497514;
          }

          /*
           * Take a string and return the hex representation of its SHA-1.
           */
          function calcSHA1(str)
          {
            var x = str2blks_SHA1(str);
            var w = new Array(80);

            var a =  1732584193;
            var b = -271733879;
            var c = -1732584194;
            var d =  271733878;
            var e = -1009589776;

            for(var i = 0; i < x.length; i += 16)
            {
              var olda = a;
              var oldb = b;
              var oldc = c;
              var oldd = d;
              var olde = e;

              for(var j = 0; j < 80; j++)
              {
                if(j < 16) w[j] = x[i + j];
                else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
                var t = safe_add(safe_add(rol(a, 5), ft(j, b, c, d)), safe_add(safe_add(e, w[j]), kt(j)));
                e = d;
                d = c;
                c = rol(b, 30);
                b = a;
                a = t;
              }

              a = safe_add(a, olda);
              b = safe_add(b, oldb);
              c = safe_add(c, oldc);
              d = safe_add(d, oldd);
              e = safe_add(e, olde);
            }
            return hex(a) + hex(b) + hex(c) + hex(d) + hex(e);
          }


          posted on 2005-05-18 14:50 emu 閱讀(637) 評論(0)  編輯  收藏 所屬分類: DHTML和JAVASCRIPT 技術
          主站蜘蛛池模板: 易门县| 五寨县| 淄博市| 全椒县| 伊吾县| 达日县| 台南市| 什邡市| 衢州市| 遵义县| 无锡市| 古浪县| 工布江达县| 宁德市| 阿城市| 黄大仙区| 平乡县| 峡江县| 扶沟县| 瓮安县| 嘉义县| 漯河市| 北碚区| 苍梧县| 扶绥县| 鹿邑县| 衢州市| 和田县| 陆川县| 大城县| 卢龙县| 聂荣县| 边坝县| 贺州市| 喜德县| 赤峰市| 商城县| 婺源县| 鄂托克前旗| 容城县| 连江县|