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

CA认证

开发平台:

Java

  1. package org.infosecurity.cryptography;
  2. import org.infosecurity.cryptography.*;
  3. /**
  4.  * <p>Title: sha1摘要算法类 </p>
  5.  * <p>Description: sha1摘要算法类 </p>
  6.  * <p>Copyright: Copyright (c) 2003</p>
  7.  * <p>Company: bouncycastle org </p>
  8.  */
  9. public class CSha1
  10.     extends CDigest
  11. {
  12.     private static final int    DIGEST_LENGTH = 20;
  13.     private int     H1, H2, H3, H4, H5;
  14.     private int[]   X = new int[80];
  15.     private int     xOff;
  16. /**
  17.  * 构造函数
  18.  */
  19.     public CSha1()
  20.     {
  21.         reset();
  22.     }
  23. public CSha1(CSha1 t)
  24. {
  25. super(t);
  26. H1 = t.H1;
  27. H2 = t.H2;
  28. H3 = t.H3;
  29. H4 = t.H4;
  30. H5 = t.H5;
  31. System.arraycopy(t.X, 0, X, 0, t.X.length);
  32. xOff = t.xOff;
  33. }
  34.     /**
  35.      * 取算法的名字
  36.  */
  37.     public String getAlgorithmName()
  38.     {
  39.         return "SHA-1";
  40.     }
  41.     /**
  42.      * 取摘要的长度SHA1为20字节/160位
  43.  */
  44.     public int getDigestSize()
  45.     {
  46.         return DIGEST_LENGTH;
  47.     }
  48.     /**
  49.      * byte[] ==>> int转换
  50.  */
  51.     protected void processWord(
  52.         byte[]  in,
  53.         int     inOff)
  54.     {
  55.         X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16)
  56.                     | ((in[inOff + 2] & 0xff) << 8) | ((in[inOff + 3] & 0xff));
  57.         // 16*4 = 64字节
  58.         // 64*8 = 512 bit
  59.         // 这时就可以进行处理一遍了
  60.         if (xOff == 16)
  61.         {
  62.             processBlock();
  63.         }
  64.     }
  65.     /**
  66.      * int ==>> byte[] 转换
  67.  */
  68.     private void unpackWord(
  69.         int     word,
  70.         byte[]  out,
  71.         int     outOff)
  72.     {
  73.         out[outOff]     = (byte)(word >>> 24);
  74.         out[outOff + 1] = (byte)(word >>> 16);
  75.         out[outOff + 2] = (byte)(word >>> 8);
  76.         out[outOff + 3] = (byte)word;
  77.     }
  78.     protected void processLength(
  79.         long    bitLength)
  80.     {
  81.         if (xOff > 14)
  82.         {
  83.             processBlock();
  84.         }
  85.         X[14] = (int)(bitLength >>> 32);
  86.         X[15] = (int)(bitLength & 0xffffffff);
  87.     }
  88.     /**
  89.      * 构造函数
  90.  */
  91.     public int doFinal(
  92.         byte[]  out,
  93.         int     outOff)
  94.     {
  95.         finish();
  96.         unpackWord(H1, out, outOff);
  97.         unpackWord(H2, out, outOff + 4);
  98.         unpackWord(H3, out, outOff + 8);
  99.         unpackWord(H4, out, outOff + 12);
  100.         unpackWord(H5, out, outOff + 16);
  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.         H5 = 0xc3d2e1f0;
  112.         xOff = 0;
  113.         for (int i = 0; i != X.length; i++)
  114.         {
  115.             X[i] = 0;
  116.         }
  117.     }
  118.     //
  119.     // Additive constants
  120.     //
  121.     private static final int    Y1 = 0x5a827999;
  122.     private static final int    Y2 = 0x6ed9eba1;
  123.     private static final int    Y3 = 0x8f1bbcdc;
  124.     private static final int    Y4 = 0xca62c1d6;
  125.     // 辅助函数f/g/h
  126.     private int f(
  127.         int    u,
  128.         int    v,
  129.         int    w)
  130.     {
  131.         return ((u & v) | ((~u) & w));
  132.     }
  133.     private int h(
  134.         int    u,
  135.         int    v,
  136.         int    w)
  137.     {
  138.         return (u ^ v ^ w);
  139.     }
  140.     private int g(
  141.         int    u,
  142.         int    v,
  143.         int    w)
  144.     {
  145.         return ((u & v) | (u & w) | (v & w));
  146.     }
  147.     private int rotateLeft(
  148.         int    x,
  149.         int    n)
  150.     {
  151.         return (x << n) | (x >>> (32 - n));
  152.     }
  153.     protected void processBlock()
  154.     {
  155.         //
  156.         // expand 16 word block into 80 word block.
  157.         //
  158.         for (int i = 16; i <= 79; i++)
  159.         {
  160.             X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1);
  161.         }
  162.         //
  163.         // 工作寄存器为5个
  164.         //
  165.         int     A = H1;
  166.         int     B = H2;
  167.         int     C = H3;
  168.         int     D = H4;
  169.         int     E = H5;
  170.         // 与MD5的不同是每一轮处理20遍
  171.         //
  172.         // round 1
  173.         //
  174.         for (int j = 0; j <= 19; j++)
  175.         {
  176.             int     t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1;
  177.             E = D;
  178.             D = C;
  179.             C = rotateLeft(B, 30);
  180.             B = A;
  181.             A = t;
  182.         }
  183.         //
  184.         // round 2
  185.         //
  186.         for (int j = 20; j <= 39; j++)
  187.         {
  188.             int     t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2;
  189.             E = D;
  190.             D = C;
  191.             C = rotateLeft(B, 30);
  192.             B = A;
  193.             A = t;
  194.         }
  195.         //
  196.         // round 3
  197.         //
  198.         for (int j = 40; j <= 59; j++)
  199.         {
  200.             int     t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3;
  201.             E = D;
  202.             D = C;
  203.             C = rotateLeft(B, 30);
  204.             B = A;
  205.             A = t;
  206.         }
  207.         //
  208.         // round 4
  209.         //
  210.         for (int j = 60; j <= 79; j++)
  211.         {
  212.             int     t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4;
  213.             E = D;
  214.             D = C;
  215.             C = rotateLeft(B, 30);
  216.             B = A;
  217.             A = t;
  218.         }
  219.         H1 += A;
  220.         H2 += B;
  221.         H3 += C;
  222.         H4 += D;
  223.         H5 += E;
  224.         //
  225.         // reset the offset and clean out the word buffer.
  226.         //
  227.         xOff = 0;
  228.         for (int i = 0; i != X.length; i++)
  229.         {
  230.             X[i] = 0;
  231.         }
  232.     }
  233. }