Heim > Web-Frontend > js-Tutorial > Javascript MD4_基础知识

Javascript MD4_基础知识

WBOY
Freigeben: 2016-05-16 19:23:15
Original
1166 Leute haben es durchsucht
From:http://pajhome.org.uk/crypt/md5/md4src.html
<span class="comment">/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD4 Message
 * Digest Algorithm, as defined in RFC 1320.
 * Version 2.1 Copyright (C) Jerrad Pierce, Paul Johnston 1999 - 2002.
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */</span>

<span class="comment">/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */</span>
<span class="reserved_word">var</span> hexcase <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> <span class="comment">/* hex output format. 0 - lowercase; 1 - uppercase    */</span>
<span class="reserved_word">var</span> b64pad <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span> <span class="comment">/* base-64 pad character. "=" for strict RFC compliance  */</span>
<span class="reserved_word">var</span> chrsz  <span class="symbol">=</span> <span class="numeric">8</span><span class="symbol">;</span> <span class="comment">/* bits per input character. 8 - ASCII; 16 - Unicode   */</span>

<span class="comment">/*
 * These are the functions you'll usually want to call
 */</span>
<span class="reserved_word">function</span> hex_md4<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binl2hex<span class="braces">(</span>core_md4<span class="braces">(</span>str2binl<span class="braces">(</span>s<span class="braces">)</span>, s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span>
<span class="reserved_word">function</span> b64_md4<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binl2b64<span class="braces">(</span>core_md4<span class="braces">(</span>str2binl<span class="braces">(</span>s<span class="braces">)</span>, s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span>
<span class="reserved_word">function</span> str_md4<span class="braces">(</span>s<span class="braces">)</span><span class="braces">{</span> <span class="reserved_word">return</span> binl2str<span class="braces">(</span>core_md4<span class="braces">(</span>str2binl<span class="braces">(</span>s<span class="braces">)</span>, s.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span><span class="braces">}</span>
<span class="reserved_word">function</span> hex_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">return</span> binl2hex<span class="braces">(</span>core_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span>
<span class="reserved_word">function</span> b64_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">return</span> binl2b64<span class="braces">(</span>core_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span>
<span class="reserved_word">function</span> str_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span> <span class="braces">{</span> <span class="reserved_word">return</span> binl2str<span class="braces">(</span>core_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span> <span class="braces">}</span>

<span class="comment">/* 
 * Perform a simple self-test to see if the VM is working 
 */</span>
<span class="reserved_word">function</span> md4_vm_test<span class="braces">(</span><span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> hex_md4<span class="braces">(</span><span class="string">"abc"</span><span class="braces">)</span> <span class="symbol">=</span><span class="symbol">=</span> <span class="string">"a448017aaf21d8525fc10ae87aa6729d"</span><span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Calculate the MD4 of an array of little-endian words, and a bit length
 */</span>
<span class="reserved_word">function</span> core_md4<span class="braces">(</span>x, len<span class="braces">)</span>
<span class="braces">{</span>
 <span class="comment">/* append padding */</span>
 x[len <span class="symbol">></span><span class="symbol">></span> <span class="numeric">5</span>] <span class="symbol">|</span><span class="symbol">=</span> <span class="numeric">0x80</span> <span class="symbol"><span class="symbol"> <span class="braces">(</span>len % <span class="numeric">32</span><span class="braces">)</span><span class="symbol">;</span>
 x[<span class="braces">(</span><span class="braces">(</span><span class="braces">(</span>len + <span class="numeric">64</span><span class="braces">)</span> <span class="symbol">></span><span class="symbol">></span><span class="symbol">></span> <span class="numeric">9</span><span class="braces">)</span> <span class="symbol"><span class="symbol"> <span class="numeric">4</span><span class="braces">)</span> + <span class="numeric">14</span>] <span class="symbol">=</span> len<span class="symbol">;</span>
 
 <span class="reserved_word">var</span> a <span class="symbol">=</span> <span class="numeric">1732584193</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> b <span class="symbol">=</span> -<span class="numeric">271733879</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> c <span class="symbol">=</span> -<span class="numeric">1732584194</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> d <span class="symbol">=</span> <span class="numeric">271733878</span><span class="symbol">;</span>

 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> x.<span class="predefined_identifier">length</span><span class="symbol">;</span> i +<span class="symbol">=</span> <span class="numeric">16</span><span class="braces">)</span>
 <span class="braces">{</span>
  <span class="reserved_word">var</span> olda <span class="symbol">=</span> a<span class="symbol">;</span>
  <span class="reserved_word">var</span> oldb <span class="symbol">=</span> b<span class="symbol">;</span>
  <span class="reserved_word">var</span> oldc <span class="symbol">=</span> c<span class="symbol">;</span>
  <span class="reserved_word">var</span> oldd <span class="symbol">=</span> d<span class="symbol">;</span>

  a <span class="symbol">=</span> md4_ff<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">0</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_ff<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">1</span>], <span class="numeric">7</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_ff<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">2</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_ff<span class="braces">(</span>b, c, d, a, x[i+ <span class="numeric">3</span>], <span class="numeric">19</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_ff<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">4</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_ff<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">5</span>], <span class="numeric">7</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_ff<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">6</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_ff<span class="braces">(</span>b, c, d, a, x[i+ <span class="numeric">7</span>], <span class="numeric">19</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_ff<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">8</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_ff<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">9</span>], <span class="numeric">7</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_ff<span class="braces">(</span>c, d, a, b, x[i+<span class="numeric">10</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_ff<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">11</span>], <span class="numeric">19</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_ff<span class="braces">(</span>a, b, c, d, x[i+<span class="numeric">12</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_ff<span class="braces">(</span>d, a, b, c, x[i+<span class="numeric">13</span>], <span class="numeric">7</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_ff<span class="braces">(</span>c, d, a, b, x[i+<span class="numeric">14</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_ff<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">15</span>], <span class="numeric">19</span><span class="braces">)</span><span class="symbol">;</span>

  a <span class="symbol">=</span> md4_gg<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">0</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_gg<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">4</span>], <span class="numeric">5</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_gg<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">8</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_gg<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">12</span>], <span class="numeric">13</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_gg<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">1</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_gg<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">5</span>], <span class="numeric">5</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_gg<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">9</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_gg<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">13</span>], <span class="numeric">13</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_gg<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">2</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_gg<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">6</span>], <span class="numeric">5</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_gg<span class="braces">(</span>c, d, a, b, x[i+<span class="numeric">10</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_gg<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">14</span>], <span class="numeric">13</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_gg<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">3</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_gg<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">7</span>], <span class="numeric">5</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_gg<span class="braces">(</span>c, d, a, b, x[i+<span class="numeric">11</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_gg<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">15</span>], <span class="numeric">13</span><span class="braces">)</span><span class="symbol">;</span>

  a <span class="symbol">=</span> md4_hh<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">0</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_hh<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">8</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_hh<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">4</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_hh<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">12</span>], <span class="numeric">15</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_hh<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">2</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_hh<span class="braces">(</span>d, a, b, c, x[i+<span class="numeric">10</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_hh<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">6</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_hh<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">14</span>], <span class="numeric">15</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_hh<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">1</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_hh<span class="braces">(</span>d, a, b, c, x[i+ <span class="numeric">9</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_hh<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">5</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_hh<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">13</span>], <span class="numeric">15</span><span class="braces">)</span><span class="symbol">;</span>
  a <span class="symbol">=</span> md4_hh<span class="braces">(</span>a, b, c, d, x[i+ <span class="numeric">3</span>], <span class="numeric">3</span> <span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> md4_hh<span class="braces">(</span>d, a, b, c, x[i+<span class="numeric">11</span>], <span class="numeric">9</span> <span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> md4_hh<span class="braces">(</span>c, d, a, b, x[i+ <span class="numeric">7</span>], <span class="numeric">11</span><span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> md4_hh<span class="braces">(</span>b, c, d, a, x[i+<span class="numeric">15</span>], <span class="numeric">15</span><span class="braces">)</span><span class="symbol">;</span>

  a <span class="symbol">=</span> safe_add<span class="braces">(</span>a, olda<span class="braces">)</span><span class="symbol">;</span>
  b <span class="symbol">=</span> safe_add<span class="braces">(</span>b, oldb<span class="braces">)</span><span class="symbol">;</span>
  c <span class="symbol">=</span> safe_add<span class="braces">(</span>c, oldc<span class="braces">)</span><span class="symbol">;</span>
  d <span class="symbol">=</span> safe_add<span class="braces">(</span>d, oldd<span class="braces">)</span><span class="symbol">;</span>

 <span class="braces">}</span>
 <span class="reserved_word">return</span> <span class="predefined_type">Array</span><span class="braces">(</span>a, b, c, d<span class="braces">)</span><span class="symbol">;</span>

<span class="braces">}</span>

<span class="comment">/*
 * These functions implement the basic operation for each round of the
 * algorithm.
 */</span>
<span class="reserved_word">function</span> md4_cmn<span class="braces">(</span>q, a, b, x, s, t<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> safe_add<span class="braces">(</span>rol<span class="braces">(</span>safe_add<span class="braces">(</span>safe_add<span class="braces">(</span>a, q<span class="braces">)</span>, safe_add<span class="braces">(</span>x, t<span class="braces">)</span><span class="braces">)</span>, s<span class="braces">)</span>, b<span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>
<span class="reserved_word">function</span> md4_ff<span class="braces">(</span>a, b, c, d, x, s<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> md4_cmn<span class="braces">(</span><span class="braces">(</span>b <span class="symbol">&</span> c<span class="braces">)</span> <span class="symbol">|</span> <span class="braces">(</span><span class="braces">(</span>~b<span class="braces">)</span> <span class="symbol">&</span> d<span class="braces">)</span>, a, <span class="numeric">0</span>, x, s, <span class="numeric">0</span><span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>
<span class="reserved_word">function</span> md4_gg<span class="braces">(</span>a, b, c, d, x, s<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> md4_cmn<span class="braces">(</span><span class="braces">(</span>b <span class="symbol">&</span> c<span class="braces">)</span> <span class="symbol">|</span> <span class="braces">(</span>b <span class="symbol">&</span> d<span class="braces">)</span> <span class="symbol">|</span> <span class="braces">(</span>c <span class="symbol">&</span> d<span class="braces">)</span>, a, <span class="numeric">0</span>, x, s, <span class="numeric">1518500249</span><span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>
<span class="reserved_word">function</span> md4_hh<span class="braces">(</span>a, b, c, d, x, s<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> md4_cmn<span class="braces">(</span>b ^ c ^ d, a, <span class="numeric">0</span>, x, s, <span class="numeric">1859775393</span><span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Calculate the HMAC-MD4, of a key and some data
 */</span>
<span class="reserved_word">function</span> core_hmac_md4<span class="braces">(</span>key, data<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">var</span> bkey <span class="symbol">=</span> str2binl<span class="braces">(</span>key<span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">if</span><span class="braces">(</span>bkey.<span class="predefined_identifier">length</span> <span class="symbol">></span> <span class="numeric">16</span><span class="braces">)</span> bkey <span class="symbol">=</span> core_md4<span class="braces">(</span>bkey, key.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="symbol">;</span>

 <span class="reserved_word">var</span> ipad <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="numeric">16</span><span class="braces">)</span>, opad <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="numeric">16</span><span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> <span class="numeric">16</span><span class="symbol">;</span> i++<span class="braces">)</span> 
 <span class="braces">{</span>
  ipad[i] <span class="symbol">=</span> bkey[i] ^ <span class="numeric">0x36363636</span><span class="symbol">;</span>
  opad[i] <span class="symbol">=</span> bkey[i] ^ <span class="numeric">0x5C5C5C5C</span><span class="symbol">;</span>
 <span class="braces">}</span>

 <span class="reserved_word">var</span> <span class="predefined_identifier">hash</span> <span class="symbol">=</span> core_md4<span class="braces">(</span>ipad.concat<span class="braces">(</span>str2binl<span class="braces">(</span>data<span class="braces">)</span><span class="braces">)</span>, <span class="numeric">512</span> + data.<span class="predefined_identifier">length</span> * chrsz<span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">return</span> core_md4<span class="braces">(</span>opad.concat<span class="braces">(</span><span class="predefined_identifier">hash</span><span class="braces">)</span>, <span class="numeric">512</span> + <span class="numeric">128</span><span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>

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

<span class="comment">/*
 * Bitwise rotate a 32-bit number to the left.
 */</span>
<span class="reserved_word">function</span> rol<span class="braces">(</span>num, cnt<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">return</span> <span class="braces">(</span>num <span class="symbol"><span class="symbol"> cnt<span class="braces">)</span> <span class="symbol">|</span> <span class="braces">(</span>num <span class="symbol">></span><span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="numeric">32</span> - cnt<span class="braces">)</span><span class="braces">)</span><span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Convert a string to an array of little-endian words
 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
 */</span>
<span class="reserved_word">function</span> str2binl<span class="braces">(</span>str<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">var</span> bin <span class="symbol">=</span> <span class="predefined_type">Array</span><span class="braces">(</span><span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> mask <span class="symbol">=</span> <span class="braces">(</span><span class="numeric">1</span> <span class="symbol"><span class="symbol"> chrsz<span class="braces">)</span> - <span class="numeric">1</span><span class="symbol">;</span>
 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> str.<span class="predefined_identifier">length</span> * chrsz<span class="symbol">;</span> i +<span class="symbol">=</span> chrsz<span class="braces">)</span>
  bin[i<span class="symbol">></span><span class="symbol">></span><span class="numeric">5</span>] <span class="symbol">|</span><span class="symbol">=</span> <span class="braces">(</span>str.charCodeAt<span class="braces">(</span>i <span class="symbol">/</span> chrsz<span class="braces">)</span> <span class="symbol">&</span> mask<span class="braces">)</span> <span class="symbol"><span class="symbol"> <span class="braces">(</span>i%<span class="numeric">32</span><span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">return</span> bin<span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Convert an array of little-endian words to a string
 */</span>
<span class="reserved_word">function</span> binl2str<span class="braces">(</span>bin<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">var</span> str <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> mask <span class="symbol">=</span> <span class="braces">(</span><span class="numeric">1</span> <span class="symbol"><span class="symbol"> chrsz<span class="braces">)</span> - <span class="numeric">1</span><span class="symbol">;</span>
 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> bin.<span class="predefined_identifier">length</span> * <span class="numeric">32</span><span class="symbol">;</span> i +<span class="symbol">=</span> chrsz<span class="braces">)</span>
  str +<span class="symbol">=</span> String.fromCharCode<span class="braces">(</span><span class="braces">(</span>bin[i<span class="symbol">></span><span class="symbol">></span><span class="numeric">5</span>] <span class="symbol">></span><span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span>i % <span class="numeric">32</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> mask<span class="braces">)</span><span class="symbol">;</span>
 <span class="reserved_word">return</span> str<span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Convert an array of little-endian words to a hex string.
 */</span>
<span class="reserved_word">function</span> binl2hex<span class="braces">(</span>binarray<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">var</span> hex_tab <span class="symbol">=</span> hexcase ? <span class="string">"0123456789ABCDEF"</span> : <span class="string">"0123456789abcdef"</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> str <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span>
 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> binarray.<span class="predefined_identifier">length</span> * <span class="numeric">4</span><span class="symbol">;</span> i++<span class="braces">)</span>
 <span class="braces">{</span>
  str +<span class="symbol">=</span> hex_tab.<span class="library_function">charAt</span><span class="braces">(</span><span class="braces">(</span>binarray[i<span class="symbol">></span><span class="symbol">></span><span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="braces">(</span>i%<span class="numeric">4</span><span class="braces">)</span>*<span class="numeric">8</span>+<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xF</span><span class="braces">)</span> +
      hex_tab.<span class="library_function">charAt</span><span class="braces">(</span><span class="braces">(</span>binarray[i<span class="symbol">></span><span class="symbol">></span><span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="braces">(</span><span class="braces">(</span>i%<span class="numeric">4</span><span class="braces">)</span>*<span class="numeric">8</span> <span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xF</span><span class="braces">)</span><span class="symbol">;</span>
 <span class="braces">}</span>
 <span class="reserved_word">return</span> str<span class="symbol">;</span>
<span class="braces">}</span>

<span class="comment">/*
 * Convert an array of little-endian words to a base-64 string
 */</span>
<span class="reserved_word">function</span> binl2b64<span class="braces">(</span>binarray<span class="braces">)</span>
<span class="braces">{</span>
 <span class="reserved_word">var</span> tab <span class="symbol">=</span> <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</span><span class="symbol">;</span>
 <span class="reserved_word">var</span> str <span class="symbol">=</span> <span class="string">""</span><span class="symbol">;</span>
 <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> i <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> i <span class="symbol"> binarray.<span class="predefined_identifier">length</span> * <span class="numeric">4</span><span class="symbol">;</span> i +<span class="symbol">=</span> <span class="numeric">3</span><span class="braces">)</span>
 <span class="braces">{</span>
  <span class="reserved_word">var</span> triplet <span class="symbol">=</span> <span class="braces">(</span><span class="braces">(</span><span class="braces">(</span>binarray[i  <span class="symbol">></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span> i  %<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span> <span class="symbol"><span class="symbol"> <span class="numeric">16</span><span class="braces">)</span>
        <span class="symbol">|</span> <span class="braces">(</span><span class="braces">(</span><span class="braces">(</span>binarray[i+<span class="numeric">1</span> <span class="symbol">></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span><span class="braces">(</span>i+<span class="numeric">1</span><span class="braces">)</span>%<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span> <span class="symbol"><span class="symbol"> <span class="numeric">8</span> <span class="braces">)</span>
        <span class="symbol">|</span> <span class="braces">(</span><span class="braces">(</span>binarray[i+<span class="numeric">2</span> <span class="symbol">></span><span class="symbol">></span> <span class="numeric">2</span>] <span class="symbol">></span><span class="symbol">></span> <span class="numeric">8</span> * <span class="braces">(</span><span class="braces">(</span>i+<span class="numeric">2</span><span class="braces">)</span>%<span class="numeric">4</span><span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0xFF</span><span class="braces">)</span><span class="symbol">;</span>
  <span class="reserved_word">for</span><span class="braces">(</span><span class="reserved_word">var</span> j <span class="symbol">=</span> <span class="numeric">0</span><span class="symbol">;</span> j <span class="symbol"> <span class="numeric">4</span><span class="symbol">;</span> j++<span class="braces">)</span>
  <span class="braces">{</span>
   <span class="reserved_word">if</span><span class="braces">(</span>i * <span class="numeric">8</span> + j * <span class="numeric">6</span> <span class="symbol">></span> binarray.<span class="predefined_identifier">length</span> * <span class="numeric">32</span><span class="braces">)</span> str +<span class="symbol">=</span> b64pad<span class="symbol">;</span>
   <span class="reserved_word">else</span> str +<span class="symbol">=</span> tab.<span class="library_function">charAt</span><span class="braces">(</span><span class="braces">(</span>triplet <span class="symbol">></span><span class="symbol">></span> <span class="numeric">6</span>*<span class="braces">(</span><span class="numeric">3</span>-j<span class="braces">)</span><span class="braces">)</span> <span class="symbol">&</span> <span class="numeric">0x3F</span><span class="braces">)</span><span class="symbol">;</span>
  <span class="braces">}</span>
 <span class="braces">}</span>
 <span class="reserved_word">return</span> str<span class="symbol">;</span>
<span class="braces">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage