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

CA认证

开发平台:

Java

  1. package org.bouncycastle.crypto.digests;
  2. import org.bouncycastle.crypto.Digest;
  3. /**
  4.  * implementation of MD4 as RFC 1320 by R. Rivest, MIT Laboratory for
  5.  * Computer Science and RSA Data Security, Inc.
  6.  * <p>
  7.  * <b>NOTE</b>: This algorithm is only included for backwards compatability
  8.  * with legacy applications, it's not secure, don't use it for anything new!
  9.  */
  10. public class MD4Digest
  11.     extends GeneralDigest
  12. {
  13.     private static final int    DIGEST_LENGTH = 16;
  14.     private int     H1, H2, H3, H4;         // IV's
  15.     private int[]   X = new int[16];
  16.     private int     xOff;
  17. /**
  18.  * Standard constructor
  19.  */
  20.     public MD4Digest()
  21.     {
  22.         reset();
  23.     }
  24. /**
  25.  * Copy constructor.  This will copy the state of the provided
  26.  * message digest.
  27.  */
  28. public MD4Digest(MD4Digest t)
  29. {
  30. super(t);
  31. H1 = t.H1;
  32. H2 = t.H2;
  33. H3 = t.H3;
  34. H4 = t.H4;
  35. System.arraycopy(t.X, 0, X, 0, t.X.length);
  36. xOff = t.xOff;
  37. }
  38.     public String getAlgorithmName()
  39.     {
  40.         return "MD4";
  41.     }
  42.     public int getDigestSize()
  43.     {
  44.         return DIGEST_LENGTH;
  45.     }
  46.     protected void processWord(
  47.         byte[]  in,
  48.         int     inOff)
  49.     {
  50.         X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8)
  51.             | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); 
  52.         if (xOff == 16)
  53.         {
  54.             processBlock();
  55.         }
  56.     }
  57.     protected void processLength(
  58.         long    bitLength)
  59.     {
  60.         if (xOff > 14)
  61.         {
  62.             processBlock();
  63.         }
  64.         X[14] = (int)(bitLength & 0xffffffff);
  65.         X[15] = (int)(bitLength >>> 32);
  66.     }
  67.     private void unpackWord(
  68.         int     word,
  69.         byte[]  out,
  70.         int     outOff)
  71.     {
  72.         out[outOff]     = (byte)word;
  73.         out[outOff + 1] = (byte)(word >>> 8);
  74.         out[outOff + 2] = (byte)(word >>> 16);
  75.         out[outOff + 3] = (byte)(word >>> 24);
  76.     }
  77.     public int doFinal(
  78.         byte[]  out,
  79.         int     outOff)
  80.     {
  81.         finish();
  82.         unpackWord(H1, out, outOff);
  83.         unpackWord(H2, out, outOff + 4);
  84.         unpackWord(H3, out, outOff + 8);
  85.         unpackWord(H4, out, outOff + 12);
  86.         reset();
  87.         return DIGEST_LENGTH;
  88.     }
  89.     /**
  90.      * reset the chaining variables to the IV values.
  91.      */
  92.     public void reset()
  93.     {
  94.         super.reset();
  95.         H1 = 0x67452301;
  96.         H2 = 0xefcdab89;
  97.         H3 = 0x98badcfe;
  98.         H4 = 0x10325476;
  99.         xOff = 0;
  100.         for (int i = 0; i != X.length; i++)
  101.         {
  102.             X[i] = 0;
  103.         }
  104.     }
  105.     //
  106.     // round 1 left rotates
  107.     //
  108.     private static final int S11 = 3;
  109.     private static final int S12 = 7;
  110.     private static final int S13 = 11;
  111.     private static final int S14 = 19;
  112.     //
  113.     // round 2 left rotates
  114.     //
  115.     private static final int S21 = 3;
  116.     private static final int S22 = 5;
  117.     private static final int S23 = 9;
  118.     private static final int S24 = 13;
  119.     //
  120.     // round 3 left rotates
  121.     //
  122.     private static final int S31 = 3;
  123.     private static final int S32 = 9;
  124.     private static final int S33 = 11;
  125.     private static final int S34 = 15;
  126.     /*
  127.      * rotate int x left n bits.
  128.      */
  129.     private int rotateLeft(
  130.         int x,
  131.         int n)
  132.     {
  133.         return (x << n) | (x >>> (32 - n));
  134.     }
  135.     /*
  136.      * F, G, H and I are the basic MD4 functions.
  137.      */
  138.     private int F(
  139.         int u,
  140.         int v,
  141.         int w)
  142.     {
  143.         return (u & v) | (~u & w);
  144.     }
  145.     private int G(
  146.         int u,
  147.         int v,
  148.         int w)
  149.     {
  150.         return (u & v) | (u & w) | (v & w);
  151.     }
  152.     private int H(
  153.         int u,
  154.         int v,
  155.         int w)
  156.     {
  157.         return u ^ v ^ w;
  158.     }
  159.     protected void processBlock()
  160.     {
  161.         int a = H1;
  162.         int b = H2;
  163.         int c = H3;
  164.         int d = H4;
  165.         //
  166.         // Round 1 - F cycle, 16 times.
  167.         //
  168.         a = rotateLeft((a + F(b, c, d) + X[ 0]), S11);
  169.         d = rotateLeft((d + F(a, b, c) + X[ 1]), S12);
  170.         c = rotateLeft((c + F(d, a, b) + X[ 2]), S13);
  171.         b = rotateLeft((b + F(c, d, a) + X[ 3]), S14);
  172.         a = rotateLeft((a + F(b, c, d) + X[ 4]), S11);
  173.         d = rotateLeft((d + F(a, b, c) + X[ 5]), S12);
  174.         c = rotateLeft((c + F(d, a, b) + X[ 6]), S13);
  175.         b = rotateLeft((b + F(c, d, a) + X[ 7]), S14);
  176.         a = rotateLeft((a + F(b, c, d) + X[ 8]), S11);
  177.         d = rotateLeft((d + F(a, b, c) + X[ 9]), S12);
  178.         c = rotateLeft((c + F(d, a, b) + X[10]), S13);
  179.         b = rotateLeft((b + F(c, d, a) + X[11]), S14);
  180.         a = rotateLeft((a + F(b, c, d) + X[12]), S11);
  181.         d = rotateLeft((d + F(a, b, c) + X[13]), S12);
  182.         c = rotateLeft((c + F(d, a, b) + X[14]), S13);
  183.         b = rotateLeft((b + F(c, d, a) + X[15]), S14);
  184.         //
  185.         // Round 2 - G cycle, 16 times.
  186.         //
  187.         a = rotateLeft((a + G(b, c, d) + X[ 0] + 0x5a827999), S21);
  188.         d = rotateLeft((d + G(a, b, c) + X[ 4] + 0x5a827999), S22);
  189.         c = rotateLeft((c + G(d, a, b) + X[ 8] + 0x5a827999), S23);
  190.         b = rotateLeft((b + G(c, d, a) + X[12] + 0x5a827999), S24);
  191.         a = rotateLeft((a + G(b, c, d) + X[ 1] + 0x5a827999), S21);
  192.         d = rotateLeft((d + G(a, b, c) + X[ 5] + 0x5a827999), S22);
  193.         c = rotateLeft((c + G(d, a, b) + X[ 9] + 0x5a827999), S23);
  194.         b = rotateLeft((b + G(c, d, a) + X[13] + 0x5a827999), S24);
  195.         a = rotateLeft((a + G(b, c, d) + X[ 2] + 0x5a827999), S21);
  196.         d = rotateLeft((d + G(a, b, c) + X[ 6] + 0x5a827999), S22);
  197.         c = rotateLeft((c + G(d, a, b) + X[10] + 0x5a827999), S23);
  198.         b = rotateLeft((b + G(c, d, a) + X[14] + 0x5a827999), S24);
  199.         a = rotateLeft((a + G(b, c, d) + X[ 3] + 0x5a827999), S21);
  200.         d = rotateLeft((d + G(a, b, c) + X[ 7] + 0x5a827999), S22);
  201.         c = rotateLeft((c + G(d, a, b) + X[11] + 0x5a827999), S23);
  202.         b = rotateLeft((b + G(c, d, a) + X[15] + 0x5a827999), S24);
  203.         //
  204.         // Round 3 - H cycle, 16 times.
  205.         //
  206.         a = rotateLeft((a + H(b, c, d) + X[ 0] + 0x6ed9eba1), S31);
  207.         d = rotateLeft((d + H(a, b, c) + X[ 8] + 0x6ed9eba1), S32);
  208.         c = rotateLeft((c + H(d, a, b) + X[ 4] + 0x6ed9eba1), S33);
  209.         b = rotateLeft((b + H(c, d, a) + X[12] + 0x6ed9eba1), S34);
  210.         a = rotateLeft((a + H(b, c, d) + X[ 2] + 0x6ed9eba1), S31);
  211.         d = rotateLeft((d + H(a, b, c) + X[10] + 0x6ed9eba1), S32);
  212.         c = rotateLeft((c + H(d, a, b) + X[ 6] + 0x6ed9eba1), S33);
  213.         b = rotateLeft((b + H(c, d, a) + X[14] + 0x6ed9eba1), S34);
  214.         a = rotateLeft((a + H(b, c, d) + X[ 1] + 0x6ed9eba1), S31);
  215.         d = rotateLeft((d + H(a, b, c) + X[ 9] + 0x6ed9eba1), S32);
  216.         c = rotateLeft((c + H(d, a, b) + X[ 5] + 0x6ed9eba1), S33);
  217.         b = rotateLeft((b + H(c, d, a) + X[13] + 0x6ed9eba1), S34);
  218.         a = rotateLeft((a + H(b, c, d) + X[ 3] + 0x6ed9eba1), S31);
  219.         d = rotateLeft((d + H(a, b, c) + X[11] + 0x6ed9eba1), S32);
  220.         c = rotateLeft((c + H(d, a, b) + X[ 7] + 0x6ed9eba1), S33);
  221.         b = rotateLeft((b + H(c, d, a) + X[15] + 0x6ed9eba1), S34);
  222.         H1 += a;
  223.         H2 += b;
  224.         H3 += c;
  225.         H4 += d;
  226.         //
  227.         // reset the offset and clean out the word buffer.
  228.         //
  229.         xOff = 0;
  230.         for (int i = 0; i != X.length; i++)
  231.         {
  232.             X[i] = 0;
  233.         }
  234.     }
  235. }