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

CA认证

开发平台:

Java

  1. package org.infosecurity.cryptography;
  2. /**
  3.  * <p>Title: DES_CBC文件加密器 </p>
  4.  * <p>Description: DES_CBC文件加密器 </p>
  5.  * <p>Copyright: Copyright (c) 2003</p>
  6.  * <p>Company: 中信信息安全组织(CISO)</p>
  7.  * @author 张荣华
  8.  * @version 1.0.2003.1028
  9.  */
  10. import org.infosecurity.cryptography.*;
  11. import java.io.*;
  12. public class FileEncryptor extends DES {
  13.     //=========================================================
  14.     // 定义错误类型,以有意义的常量代替数字
  15.     public final static int S_OK        =  1; /* 成功         */
  16.     public final static int S_IV_ERROR  = -1; /* 初始化向量出错 */
  17.     public final static int S_ENC_ERROR = -2; /* 加密错误      */
  18.     public final static int S_DEC_ERROR = -3; /* 解密错误      */
  19.     /**
  20.      * 构造函数
  21.      * @param pwd 密码 (8 个字节)
  22.      */
  23.     public FileEncryptor(byte[] pwd) {
  24.         super(pwd);
  25.     }
  26.     /**
  27.      * CBC模式的加密
  28.      * @param iv  初始向量
  29.      * @param in  输入数据
  30.      * @param out 输出数据
  31.      * @return 输出数据的长度
  32.      */
  33.     public int EncryptCBC(byte[] iv,InputStream in,OutputStream out)
  34.             throws IOException
  35.     {
  36.         // =========================================================
  37.         // 定义变量
  38.         int out_length    = 0;              /* 输出长度           */
  39.         int block_count   = 0;              /* 数据块数           */
  40.         int return_flag   =-2;              /* 返回字节数         */
  41.         byte remaider     = 0;              /* 剩余字节数         */
  42.         byte[] IV         = new byte[8];    /* 初始向量           */
  43.         byte[] bTemp      = new byte[8];    /* 临时缓冲区         */
  44.         byte[] out_block  = new byte[8];    /* 输出内容           */
  45.         byte[] last_block = new byte[8];    /* 最后一个数据块      */
  46.         // =========================================================
  47.         // 合法性检查
  48.         if(iv == null||iv.length!=8)
  49.             return S_IV_ERROR;
  50.         // =========================================================
  51.         // 处理IV
  52.         out_block = encrypt(iv);
  53.         if(out_block == null || out_block.length == 0)
  54.             return S_ENC_ERROR;
  55.         out.write(out_block,0,8);
  56.         out.flush();
  57.         System.arraycopy(out_block,0,IV, 0,8);
  58.         out_length += 8;
  59.         // =========================================================
  60.         // 处理输入的数据
  61.         return_flag=in.read(bTemp,0,8);
  62.         while(return_flag==8)
  63.         {
  64.             for(int j = 0;j < 8;j++)
  65.             {
  66.                 IV[j]^=bTemp[j];
  67.                 //MyDebug.out("in["+j+"]="+bTemp[j]);      /* 调试信息 */
  68.             }
  69.             out_length += 8;
  70.             out_block = encrypt(IV);
  71.             if(out_block == null || out_block.length==0)
  72.                 return S_ENC_ERROR;
  73.             out.write(out_block,0,8);
  74.             out.flush();
  75.             System.arraycopy(out_block,0,IV,0,8);
  76.             out_block = null;
  77.             return_flag=in.read(bTemp,0,8);
  78.         }
  79.         // =========================================================
  80.         // 处理输入数据最后一个数据块
  81.         byte value=0;
  82.         if(return_flag>0)
  83.         {
  84.             value = (byte)(8 - return_flag);
  85.             System.arraycopy(bTemp,0,last_block,0,return_flag);/* 如果有数据,将它复制过来 */
  86.             for(int i=return_flag;i<8;i++)last_block[i]=value; /* 进行填充              */
  87.         }
  88.         else
  89.         {
  90.             value = (byte)8;
  91.             for(int i=0;i<8;i++)last_block[i]=(byte)8;        /* 进行填充              */
  92.         }
  93.         for(int j = 0;j < 8;j++)
  94.             IV[j]^=last_block[j];
  95.         out_length += 8;
  96.         out_block = encrypt(IV);
  97.         if(out_block == null || out_block.length==0)
  98.             return S_ENC_ERROR;
  99.         out.write(out_block,0,8);
  100.         out.flush();
  101. //        out.close();
  102. //        in.close();
  103.         return out_length;
  104.     }
  105.     /**
  106.      * CBC模式的解密
  107.      * @param in  输入数据
  108.      * @param out 输出数据
  109.      * @return 输出数据的长度
  110.      */
  111.     public int DecryptCBC(InputStream in,OutputStream out) throws IOException
  112.     {
  113.         // =========================================================
  114.         // 定义变量
  115.         int out_length    = 0,cur_pos = 0;  /* 输出长度与当前位置 */
  116.         int block_count   = 0;              /* 数据块数           */
  117.         byte remaider     = 0;              /* 剩余字节数         */
  118.         int return_flag   =-2;              /* 返回字节数         */
  119.         byte[] IV         = new byte[8];    /* 初始化向量         */
  120.         byte[] bTemp      = new byte[8];    /* 临时缓冲区         */
  121.         byte[] out_block  = new byte[8];    /* 输出内容           */
  122.         byte[] last_block = new byte[8];    /* 最后一个数据块      */
  123.         // =========================================================
  124.         // 处理IV
  125.         block_count = in.available()/8;
  126.         return_flag = in.read(IV,0,8);
  127.         // =========================================================
  128.         // 处理输入的数据
  129.         return_flag = in.read(bTemp,0,8);
  130.         for(int i = 0 ; i < block_count-1&&return_flag>0;i++) /* -1的原因是要去除第一块 */
  131.         {
  132.             out_block = decrypt(bTemp);
  133.             if(out_block == null || out_block.length==0)
  134.                 return S_DEC_ERROR;
  135.             for(int j = 0;j < 8;j++)
  136.             {
  137.                 out_block[j]^=IV[j];
  138.                 //MyDebug.out("out_block["+j+"]="+out_block[j]);
  139.                                               /* 调试信息          */
  140.             }
  141.             if(i==block_count-2)
  142.             {
  143.                 byte real_count = (byte)(8 - out_block[7]);
  144.                 out_length += real_count;
  145.                 out.write(out_block,0,real_count);
  146.             }
  147.             else
  148.             {
  149.                 out_length += 8;
  150.                 out.write(out_block,0,8);
  151.             }
  152.             out.flush();
  153.             System.arraycopy(bTemp,0,IV,0,8);
  154.             out_block = null;
  155.             return_flag = in.read(bTemp,0,8);
  156.         }
  157.         return out_length;
  158.     }
  159.     public static void main(String args[])
  160.     {
  161.         FileInputStream  fis = null;
  162.         FileOutputStream fos = null;
  163.         try {
  164.             FileEncryptor fe = new FileEncryptor("12345678".getBytes());
  165.             fis = new FileInputStream("E:\JavaProj\temp\ciphertext.txt");
  166.             fos = new FileOutputStream("E:\JavaProj\temp\result.txt");
  167.             fe.DecryptCBC(fis,fos);
  168.             fis.close();
  169.             fos.close();
  170.         }
  171.         catch (IOException ex) {
  172.             MyDebug.out("Dec 出错了!");
  173.         }
  174.     }
  175. }