emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            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 閱讀(638) 評論(0)  編輯  收藏 所屬分類: DHTML和JAVASCRIPT 技術
          主站蜘蛛池模板: 砀山县| 西畴县| 芷江| 白河县| 揭东县| 咸丰县| 灯塔市| 福海县| 宁明县| 连城县| 会理县| 沙河市| 金坛市| 正蓝旗| 泗水县| 云梦县| 同德县| 定兴县| 葫芦岛市| 遂宁市| 甘洛县| 佛冈县| 花垣县| 宁乡县| 兖州市| 新泰市| 五常市| 枣强县| 武山县| 措勤县| 南宁市| 泰和县| 芷江| 仙游县| 保定市| 博爱县| 六盘水市| 高淳县| 怀化市| 江达县| 花莲县|