アプレットのMD5 32ビット暗号化

直接コードに、遭遇したプロジェクト、MD5暗号化を実行します。

/ * 
* RSA Data Security社のMD5メッセージのJavaScript実装
*ダイジェストアルゴリズム、RFCで定義されている1321 
*バージョン1.1著作権(C)ポール・ジョンストン1999 - 2002 
*コードは、グレッグ・ホルトによって寄与
* HTTPを参照してください。詳細については//pajhome.org.uk/site/legal.html。
* / 



/ * 
* 2 ^ 32で包み、整数を追加します。これは、内部で16ビット演算を使用して
、いくつかのJS通訳のバグを回避するには、*。
* / 

関数safe_add(X、Y){ 

  VARの LSW =(X&が0xFFFF)+(Y&0xFFFFの

  VAR MSW =(X >> 16)+(Y >> 16)+(LSW >> 16 

  リターン(MSW << 16)| (LSW&0xFFFFの

} 



/ *
*ビット単位の左に32ビットの数値を回転させます。
* / 

ファンクションROL(NUM、CNT){ 

  リターン(NUM << CNT)| (NUM >>>(32 - CNT))

} 



/ * 
*これらの機能は、アルゴリズムが使用する四つの基本的な操作を実現します。
* / 

関数CMN(Q、A、B、X、S、T){ 

  戻りsafe_add(ROL(safe_add(safe_add(q)は、(X、T))、S)、B safe_add)

} 

関数FFを(A A、B、C、D、X、S、T){ 

  戻り CMN((B&C)|((〜B)およびD)、A、B、X、S、T)

} 

関数GG(A、B、 C、D、X、S、T){ 

  戻り CMN((B&D)|(C&(〜D))、A、B、X、S、T)

} 

関数HH(A、B、C、D、X、S、T){ 

  戻り CMN(B ^ C ^ D、A、B、X、S、T)

} 

関数II(A、B、C、D、X、 S、T){ 

  戻り CMN(C ^(B |(〜D))、A、B、X、S、T)

} 



/ * 
*アレイを製造する、リトルエンディアンワードの配列のMD5を計算
*のリトルエンディアンの言葉。
* / 

関数coreMD5(X){ 

  VAR A = 1732584193 するvar B = -271733879 VAR C = -1732584194 するvar D = 271733878 ためVAR i = 0; iはx.lengthを<; I + = 16 ){ VARの oldaは= VARを OLDB =

  

  

  



  

    

    Bの

    VAR oldc = C 

    VARしかもoldd = D


 = FFの(A、B、C、D、X [I + 0]、7、-680876936 

    のD =用FF(D、A、B、C、X [I + 1 ]、12、-389564586 

    C = FFの(C、D、A、B、X [I + 2]、17、606105819 

    のB = FFの(B、C、D、X [I + 3]、22 、-1044525330 
 = FFの(A、B、C、D、X [I + 4]、7、-176418897 

    のD =用FF(D、A、B、C、X [I + 5]、12、1200080426 

    のC = FFの(C、D、A、B、X [I + 6]、17、-1473231341 

    のB = FFの(B、C、D、X [I + 7]、22、-45705983 

    A= FFの(A、B、C、D、X [I + 8]、7、1770035416 

    のD =用FF(D、A、B、C、X [I + 9]、12、-1958414417 

    C = FFの( C、D、A、B、Xが[iが10 +]、17、-42063 

    のB = FFの(B、C、D、-1990404162、22、X [iが11 +] 
 = FFの(、 B、C、D、X [iが12 +]、7、1804603682 

    D =のFF(D、A、B、C、X [iが13 +]、12、-40341101 

    のC = FFの(C、D、 A、B、X 17、-1502002290、[私は14 +] 

    のB = FFの(B、C、D、X [I 15 +]、22、1236535329 



    A = GG(A、B、C、D、 X [I + 1]、5、-165796510 

    D = GG(D、A、B、C、X [I + 6]、9、-1069501632

    C = GG(C、D、A、B、X [I 11 +]、14、643717713 

    B = GG(B、C、D、X [I + 0]、20、-373897302 

    A = GG(A、B、C、D、X [I + 5]、5、-701558691 

    D = GG(D、A、B、C、X 38016083、9、[iが10 +] 

    C = GG(C 、D、A、B、X [I 15 +]、14、-660478335 

    B = GG(B、C、D、X [I + 4]、20、-405537848 

    A = GG(B 、C、D、X [I + 9]、5、568446438 

    D = GG(D、A、B、C、X 9、-1019803690、[私は14 +] 

    C、= GG(C、D B、X [I + 3]、14、-187363961 

    B= GG(B、C、D、X [iが+ 8]、20、1163531501 

    A = GG(A、B、C、D、X [iが13 +]、5、-1444681467 

    D = GG( D、A、B、C、X [I + 2]、9、-51403784 

    C = GG(C、D、A、B、X [I + 7]、14、1735328473 

    B = GG(B、C 、D、-1926607734、20、X [iが12 +] 


 =のHH(A、B、C、D、X [I + 5]、4、-378558 

    のD =のHH(D、B 、C、X [I + 8]、11、-2022574463 

    C =のHH(C、D、A、B、xは、16、1839030562 [iが11 +] 

    bは、=のHH(B、C、D、 X、23、[私は14 +] -35309556 
 =のHH(A、B、C、D、X [I + 1]、4、-1530992060 

    D =のHH(D、A、B、C、X [I + 4]、11、1272893353 

    C =のHH(C、D、A、B、X [I + 7]、16、-155497632 

    B = HH (B、C、D、-1094730640、23、X [iが10 +] 
 =のHH(A、B、C、D、X [iが13 +]、4、681279174 

    のD =のHH(D、 A、B、C、X [I + 0]、11、-358537222 

    C =のHH(C、D、A、B、X [I + 3]、16、-722521979 

    のB =のHH(B、C、 D、X [I + 6]、23、76029189 
 =のHH(A、B、C、D、X [I + 9]、4、-640364487 

    のD =のHH(D、A、B、C 、X -421815835、11、[I + 12] 

    C=のHh(C、D、A、B、Xは、16、530742520 [iが15 +] 

    B =のHH(B、C、D、Xは[I + 2]、23、-995338651 



    A = II( A、B、C、D、X [I + 0]、6、-198630844 

    dは = II(D、A、B、C、X [I + 7]、10、1126891415 

    C = II(C、Dそして、B、X -1416354905、15、[私は14 +] 

    B = II(B、C、D、X [I + 5]、21、-57434055 

    A = II(A、B、C 、D、X [iが12 +]、6、1700485571 

    dは = II(D、A、B、C、X [I + 3]、10、-1894986606 

    C = II(C、D、A、B、 X -1051523、15、[iが10 +] 

    B = II(B、C、D、X [I + 1]、21、-2054922799

    A = II(A、B、C、D、X [I + 8]、6、1873313359 

    dは = II(D、A、B、C、X、10、[私は15 +] -30611744 

    C = II(C、D、A、B、X [I + 6]、15、-1560198380 

    B = II(B、C、D、X 1309151649、21、[私は13 +] 

    および = II(A A、B、C、D、X [I + 4]、6、-145523070 

    D = II(D、A、B、C、X [iが11 +]、10、-1120210379 

    C = II(C、Dそして、B、X [I + 2]、15、718787259 

    B = II(B、C、D、X [I + 9]、21、-343485551 



    及び = safe_add(olda)

    B = safe_add(B、OLDB)

    C = safe_add(C、oldc)

    D = safe_add(D、しかもoldd)

  } 

  戻り[A、B、C、D] 

} 



/ * 
* 16進文字列にリトルエンディアンワードの配列を変換します。
* / 

関数binl2hex(binarray){ 

  VARの hex_tab = "0123456789ABCDEF" VaRの STR = "" のためのVAR I = 0; iがbinarray.length * 4 <; iは++ ){ 
    STR + = hex_tab.charAt((binarray [I >> 2] >>((I 4%)* 8 + 4))&0xFの)+ 
      hex_tab.charAt((binarray [I >> 2] >>((I 4%)* 8))&

  

  




  





* base64でエンコードされた文字列にリトルエンディアンの単語の配列に変換します。
* / 

関数binl2b64(binarray){ 

  VARのタブ= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /" VARの STR = "" のためのVAR i = 0; iは<binarray.length * 32、I + = 6 ){ 
    STR + = tab.charAt((( binarray [I >> 5] <<(I%32))とは0x3F)| 
      ((binarray [I >> 5 + 1] >>(32 - I%32))とは0x3F ))
  } 戻りSTR 
} / * 
*格納された16ワードのブロックのシーケンスに8ビット文字列に変換
アレイとして*

  

  




  





文字のいずれかが> 255の場合は*、高いバイトは黙って無視されます。
* / 

関数str2binl(STR){ 

  VARの nblk =((str.length + 8)>> 6)+ 1 // 16ワードブロックの数   

  VAR BLKS = 新しいアレイ(nblk * 16 

  のためのVAR I = 0;私は16 * nblk <;私は、[I] = 0)BLKS ++のためにVAR ; I <str.length私は++ i = 0 
    BLKS [I |&0xFFで)<< >> 2] =(str.charCodeAt(I) ((I 4%)* 8 
  BLKS [I >> 2] | = 0x80の<<((I 4%)* 8 
  BLKS [nblk * 16から2] = str.length * 8 戻りBLKS

  




  

} 



/ *
*として格納された16ワードのブロックの配列にワイド文字列に変換
アレイ*、及びMD4 / 5の計算のために適切なパディングを追加します。
* / 

関数strw2binl(STR){ 

  VARの nblk =((str.length + 4)>> 5)+ 1 // 16ワードブロックの数   

  VAR BLKS = 新しいアレイ(nblk * 16 

  のためのVAR I = 0;私はnblk * 16 <; iは++)BLKS [I] = 0 のためのVAR i = 0; I <str.length; iは++ 
    BLKS [I >> 1] | = str.charCodeAt(I)<<((I% 2)* 16 
  BLKS [I >> 1] | = 0x80の<<((I 2%)* 16 

  



  BLKS [nblk* 16から2] = str.length * 16 リターンBLKS 
} / * 
*外部インタフェース* / 機能 hexMD5(STR){ 戻りbinl2hex(coreMD5(str2binl(STR)))} 関数 hexMD5w(STR){ 戻りbinl2hex(coreMD5( strw2binl(STR)))} 関数 b64MD5(STR){ 戻りbinl2b64(coreMD5(str2binl(STR)))} 関数 b64MD5w(STR){ 戻りbinl2b64(coreMD5(strw2binl(STR)))} / * 下位互換性* / 機能 calcMD5(STR){ 戻りbinl2hex(coreMD5(str2binl(STR)))} 
module.exportsは =

  


















{ 

  hexMD5:hexMD5 

}

参考文献:

CONST MD5 =(」../../のutilsの必要 / MD5"を); 
小文字を使用して:(これは、最終的な希望の文字列はケース低下させます)
md5.hexMD5(STR).toLowerCase()

おすすめ

転載: www.cnblogs.com/siyecao2010/p/11270551.html