CMd5.java
上传用户:lior1029
上传日期:2013-05-07
资源大小:209k
文件大小:9k
源码类别:

CA认证

开发平台:

Java

  1. package org.infosecurity.cryptography;
  2. import org.infosecurity.cryptography.*;
  3. /**
  4.  * <p>Title: MD5摘要算法类 </p>
  5.  * <p>Description: MD5摘要算法类 </p>
  6.  * <p>Copyright: Copyright (c) 2003</p>
  7.  * <p>Company: bouncycastle org </p>
  8.  * 使用例子:indata--输入一个字节 hashResult--输出16个字节 indatalen--输入数据长度
  9.  *  String str="djkdkjdfkjdk";
  10.  *  byte[] indata = str.getBytes();
  11.  *  int indatalen =indata.length;
  12.  *  byte hashResult[] = new byte[16];// sha1-new byte[20]
  13.  *
  14.  *  CMd5 md5=new CMd5();
  15.  *  for(int i=0;i<indatalen;i++)
  16.  *    md5.update(indata[i]);
  17.  *  md5.doFinal(hashResult,0);
  18.  */
  19. public class CMd5 extends CDigest
  20. {
  21.     private static final int    DIGEST_LENGTH = 16;
  22.     private int     H1, H2, H3, H4;         // IV's
  23.     // 512=16*4*8 bit为一个分组进行处理
  24.     private int[]   X = new int[16];
  25.     private int     xOff;
  26.     // 构造函数
  27.     public CMd5()
  28.     {
  29.         reset();
  30.     }
  31.     //
  32. public CMd5(CMd5 t)
  33. {
  34. super(t);
  35. H1 = t.H1;
  36. H2 = t.H2;
  37. H3 = t.H3;
  38. H4 = t.H4;
  39. System.arraycopy(t.X, 0, X, 0, t.X.length);
  40. xOff = t.xOff;
  41. }
  42.     public String getAlgorithmName()
  43.     {
  44.         return "MD5";
  45.     }
  46.     // 取摘要的长度(MD5O为16字节/128位)
  47.     public int getDigestSize()
  48.     {
  49.         return DIGEST_LENGTH;
  50.     }
  51.     //  byte[] ==>> int转换
  52.     protected void processWord(
  53.         byte[]  in,
  54.         int     inOff)
  55.     {
  56.         X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8)
  57.             | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24);
  58.         // 16*4 = 64字节
  59.         // 64*8 = 512 bit
  60.         // 这时就可以进行处理一遍了
  61.         if (xOff == 16)
  62.         {
  63.             processBlock();
  64.         }
  65.     }
  66.     // 处理长度
  67.     protected void processLength(
  68.         long    bitLength)
  69.     {
  70.         if (xOff > 14)
  71.         {
  72.             processBlock();
  73.         }
  74.         // 最后8个字节(64bit)为长度信息,低位在左边,高位在右边
  75.         // 低4位
  76.         X[14] = (int)(bitLength & 0xffffffff);
  77.         // 高4位
  78.         X[15] = (int)(bitLength >>> 32);
  79.     }
  80.     // int ==>> byte[] 转换
  81.     private void unpackWord(
  82.         int     word,
  83.         byte[]  out,
  84.         int     outOff)
  85.     {
  86.         out[outOff]     = (byte)word;
  87.         out[outOff + 1] = (byte)(word >>> 8);
  88.         out[outOff + 2] = (byte)(word >>> 16);
  89.         out[outOff + 3] = (byte)(word >>> 24);
  90.     }
  91.     // 处理结束,并调用reset以便可以进行下一次的摘要操作
  92.     public int doFinal(
  93.         byte[]  out,
  94.         int     outOff)
  95.     {
  96.         finish();
  97.         unpackWord(H1, out, outOff);
  98.         unpackWord(H2, out, outOff + 4);
  99.         unpackWord(H3, out, outOff + 8);
  100.         unpackWord(H4, out, outOff + 12);
  101.         reset();
  102.         return DIGEST_LENGTH;
  103.     }
  104.     public void reset()
  105.     {
  106.         super.reset();
  107.         H1 = 0x67452301;
  108.         H2 = 0xefcdab89;
  109.         H3 = 0x98badcfe;
  110.         H4 = 0x10325476;
  111.         xOff = 0;
  112.         for (int i = 0; i != X.length; i++)
  113.         {
  114.             X[i] = 0;
  115.         }
  116.     }
  117.     //
  118.     // round 1 left rotates
  119.     //
  120.     private static final int S11 = 7;
  121.     private static final int S12 = 12;
  122.     private static final int S13 = 17;
  123.     private static final int S14 = 22;
  124.     //
  125.     // round 2 left rotates
  126.     //
  127.     private static final int S21 = 5;
  128.     private static final int S22 = 9;
  129.     private static final int S23 = 14;
  130.     private static final int S24 = 20;
  131.     //
  132.     // round 3 left rotates
  133.     //
  134.     private static final int S31 = 4;
  135.     private static final int S32 = 11;
  136.     private static final int S33 = 16;
  137.     private static final int S34 = 23;
  138.     //
  139.     // round 4 left rotates
  140.     //
  141.     private static final int S41 = 6;
  142.     private static final int S42 = 10;
  143.     private static final int S43 = 15;
  144.     private static final int S44 = 21;
  145.     /*
  146.      * int x 左移 n 位.
  147.      */
  148.     private int rotateLeft(
  149.         int x,
  150.         int n)
  151.     {
  152.         return (x << n) | (x >>> (32 - n));
  153.     }
  154.     /*
  155.      * F, G, H and I 是MD5在RFC中定义的几个基本函数
  156.      */
  157.     private int F(
  158.         int u,
  159.         int v,
  160.         int w)
  161.     {
  162.         return (u & v) | (~u & w);
  163.     }
  164.     private int G(
  165.         int u,
  166.         int v,
  167.         int w)
  168.     {
  169.         return (u & w) | (v & ~w);
  170.     }
  171.     private int H(
  172.         int u,
  173.         int v,
  174.         int w)
  175.     {
  176.         return u ^ v ^ w;
  177.     }
  178.     private int K(
  179.         int u,
  180.         int v,
  181.         int w)
  182.     {
  183.         return v ^ (u | ~w);
  184.     }
  185.     protected void processBlock()
  186.     {
  187.         //  一个128位MD缓冲区用以保存中间和最终
  188.         //  散列函数的结果。它可以表示为4个32位的寄存器(A,B,C,D)
  189.         int a = H1;
  190.         int b = H2;
  191.         int c = H3;
  192.         int d = H4;
  193.         //
  194.         // 第1轮处理(16次).
  195.         //
  196.         a = rotateLeft((a + F(b, c, d) + X[ 0] + 0xd76aa478), S11) + b;
  197.         d = rotateLeft((d + F(a, b, c) + X[ 1] + 0xe8c7b756), S12) + a;
  198.         c = rotateLeft((c + F(d, a, b) + X[ 2] + 0x242070db), S13) + d;
  199.         b = rotateLeft((b + F(c, d, a) + X[ 3] + 0xc1bdceee), S14) + c;
  200.         a = rotateLeft((a + F(b, c, d) + X[ 4] + 0xf57c0faf), S11) + b;
  201.         d = rotateLeft((d + F(a, b, c) + X[ 5] + 0x4787c62a), S12) + a;
  202.         c = rotateLeft((c + F(d, a, b) + X[ 6] + 0xa8304613), S13) + d;
  203.         b = rotateLeft((b + F(c, d, a) + X[ 7] + 0xfd469501), S14) + c;
  204.         a = rotateLeft((a + F(b, c, d) + X[ 8] + 0x698098d8), S11) + b;
  205.         d = rotateLeft((d + F(a, b, c) + X[ 9] + 0x8b44f7af), S12) + a;
  206.         c = rotateLeft((c + F(d, a, b) + X[10] + 0xffff5bb1), S13) + d;
  207.         b = rotateLeft((b + F(c, d, a) + X[11] + 0x895cd7be), S14) + c;
  208.         a = rotateLeft((a + F(b, c, d) + X[12] + 0x6b901122), S11) + b;
  209.         d = rotateLeft((d + F(a, b, c) + X[13] + 0xfd987193), S12) + a;
  210.         c = rotateLeft((c + F(d, a, b) + X[14] + 0xa679438e), S13) + d;
  211.         b = rotateLeft((b + F(c, d, a) + X[15] + 0x49b40821), S14) + c;
  212.         //
  213.         // 第2轮处理(16次).
  214.         //
  215.         a = rotateLeft((a + G(b, c, d) + X[ 1] + 0xf61e2562), S21) + b;
  216.         d = rotateLeft((d + G(a, b, c) + X[ 6] + 0xc040b340), S22) + a;
  217.         c = rotateLeft((c + G(d, a, b) + X[11] + 0x265e5a51), S23) + d;
  218.         b = rotateLeft((b + G(c, d, a) + X[ 0] + 0xe9b6c7aa), S24) + c;
  219.         a = rotateLeft((a + G(b, c, d) + X[ 5] + 0xd62f105d), S21) + b;
  220.         d = rotateLeft((d + G(a, b, c) + X[10] + 0x02441453), S22) + a;
  221.         c = rotateLeft((c + G(d, a, b) + X[15] + 0xd8a1e681), S23) + d;
  222.         b = rotateLeft((b + G(c, d, a) + X[ 4] + 0xe7d3fbc8), S24) + c;
  223.         a = rotateLeft((a + G(b, c, d) + X[ 9] + 0x21e1cde6), S21) + b;
  224.         d = rotateLeft((d + G(a, b, c) + X[14] + 0xc33707d6), S22) + a;
  225.         c = rotateLeft((c + G(d, a, b) + X[ 3] + 0xf4d50d87), S23) + d;
  226.         b = rotateLeft((b + G(c, d, a) + X[ 8] + 0x455a14ed), S24) + c;
  227.         a = rotateLeft((a + G(b, c, d) + X[13] + 0xa9e3e905), S21) + b;
  228.         d = rotateLeft((d + G(a, b, c) + X[ 2] + 0xfcefa3f8), S22) + a;
  229.         c = rotateLeft((c + G(d, a, b) + X[ 7] + 0x676f02d9), S23) + d;
  230.         b = rotateLeft((b + G(c, d, a) + X[12] + 0x8d2a4c8a), S24) + c;
  231.         //
  232.         // 第3轮处理(16次).
  233.         //
  234.         a = rotateLeft((a + H(b, c, d) + X[ 5] + 0xfffa3942), S31) + b;
  235.         d = rotateLeft((d + H(a, b, c) + X[ 8] + 0x8771f681), S32) + a;
  236.         c = rotateLeft((c + H(d, a, b) + X[11] + 0x6d9d6122), S33) + d;
  237.         b = rotateLeft((b + H(c, d, a) + X[14] + 0xfde5380c), S34) + c;
  238.         a = rotateLeft((a + H(b, c, d) + X[ 1] + 0xa4beea44), S31) + b;
  239.         d = rotateLeft((d + H(a, b, c) + X[ 4] + 0x4bdecfa9), S32) + a;
  240.         c = rotateLeft((c + H(d, a, b) + X[ 7] + 0xf6bb4b60), S33) + d;
  241.         b = rotateLeft((b + H(c, d, a) + X[10] + 0xbebfbc70), S34) + c;
  242.         a = rotateLeft((a + H(b, c, d) + X[13] + 0x289b7ec6), S31) + b;
  243.         d = rotateLeft((d + H(a, b, c) + X[ 0] + 0xeaa127fa), S32) + a;
  244.         c = rotateLeft((c + H(d, a, b) + X[ 3] + 0xd4ef3085), S33) + d;
  245.         b = rotateLeft((b + H(c, d, a) + X[ 6] + 0x04881d05), S34) + c;
  246.         a = rotateLeft((a + H(b, c, d) + X[ 9] + 0xd9d4d039), S31) + b;
  247.         d = rotateLeft((d + H(a, b, c) + X[12] + 0xe6db99e5), S32) + a;
  248.         c = rotateLeft((c + H(d, a, b) + X[15] + 0x1fa27cf8), S33) + d;
  249.         b = rotateLeft((b + H(c, d, a) + X[ 2] + 0xc4ac5665), S34) + c;
  250.         //
  251.         // 第4轮处理(16次).
  252.         //
  253.         a = rotateLeft((a + K(b, c, d) + X[ 0] + 0xf4292244), S41) + b;
  254.         d = rotateLeft((d + K(a, b, c) + X[ 7] + 0x432aff97), S42) + a;
  255.         c = rotateLeft((c + K(d, a, b) + X[14] + 0xab9423a7), S43) + d;
  256.         b = rotateLeft((b + K(c, d, a) + X[ 5] + 0xfc93a039), S44) + c;
  257.         a = rotateLeft((a + K(b, c, d) + X[12] + 0x655b59c3), S41) + b;
  258.         d = rotateLeft((d + K(a, b, c) + X[ 3] + 0x8f0ccc92), S42) + a;
  259.         c = rotateLeft((c + K(d, a, b) + X[10] + 0xffeff47d), S43) + d;
  260.         b = rotateLeft((b + K(c, d, a) + X[ 1] + 0x85845dd1), S44) + c;
  261.         a = rotateLeft((a + K(b, c, d) + X[ 8] + 0x6fa87e4f), S41) + b;
  262.         d = rotateLeft((d + K(a, b, c) + X[15] + 0xfe2ce6e0), S42) + a;
  263.         c = rotateLeft((c + K(d, a, b) + X[ 6] + 0xa3014314), S43) + d;
  264.         b = rotateLeft((b + K(c, d, a) + X[13] + 0x4e0811a1), S44) + c;
  265.         a = rotateLeft((a + K(b, c, d) + X[ 4] + 0xf7537e82), S41) + b;
  266.         d = rotateLeft((d + K(a, b, c) + X[11] + 0xbd3af235), S42) + a;
  267.         c = rotateLeft((c + K(d, a, b) + X[ 2] + 0x2ad7d2bb), S43) + d;
  268.         b = rotateLeft((b + K(c, d, a) + X[ 9] + 0xeb86d391), S44) + c;
  269.         H1 += a;
  270.         H2 += b;
  271.         H3 += c;
  272.         H4 += d;
  273.         xOff = 0;
  274.         for (int i = 0; i != X.length; i++)
  275.         {
  276.             X[i] = 0;
  277.         }
  278.     }
  279. }