基于DES的文件加密/解密的实现

 

1.DES算法简介

  DESData Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:KeyDataMode。其中Key8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;ModeDES的工作方式,有两种:加密或解密。

  DES算法工作流程如下:若Mode为加密模式,则利用Key 对数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密模式,则利用Key对密码形式的数据Data进行解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据在公共通信网中传输的安全性和可靠性。

  也可以通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性。

2.代码实现

下面是实现的粗糙的实现,有兴趣的朋友可以将输入输出部分用swing实现,以增加易用性。

public class FileProc {

    private Cipher cip = null;

    private int MODE = 2;

    private String inputfilename = null;

    private String outputfilename = null;

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       FileProc f = new FileProc();

       f.inputfilename = "c://移动物流项目总体设计2.doc";

       f.outputfilename = "c://移动物流项目总体设计3.doc";

       f.init();

       f.ProcData();

 

    }

 

    private InputStream readFile(String filename) throws FileNotFoundException {

       return new FileInputStream(filename);

    }

 

    private OutputStream writeFile(String filename)

           throws FileNotFoundException {

       return new FileOutputStream(filename);

    }

 

    private void ProcData() {

 

       try {

           InputStream in = readFile(inputfilename);

           OutputStream out = writeFile(outputfilename);

 

           if (MODE == 1) {

              byte[] data = new byte[1024];

              byte[] data2 = null;

              ObjectOutputStream oo = new ObjectOutputStream(out);

              while (in.read(data) > 0) {

                  data2 = cip.doFinal(data);

                  oo.writeObject(data2);

              }

              oo.close();

 

           } else {

              ObjectInputStream oi = new ObjectInputStream(in);

              byte[] data = null;

              byte[] data2 = null;

              while (true) {

                  try {

                     data = (byte[]) oi.readObject();

                  } catch (EOFException e) {

                     break;

                  }

                  data2 = cip.doFinal(data);

                  out.write(data2);

 

              }

              oi.close();

 

           }

           in.close();

           out.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

 

    }

 

    private void init() {

       Security.addProvider(new com.sun.crypto.provider.SunJCE());

       String Algorithm = "DES";

       KeyGenerator keygen;

       try {

           SecretKey deskey = null;

           if (MODE == 1) {

              keygen = KeyGenerator.getInstance(Algorithm);

              deskey = keygen.generateKey();

              OutputStream out = writeFile(outputfilename + ".key");

              ObjectOutputStream oo = new ObjectOutputStream(out);

              oo.writeObject(deskey);

              oo.close();

              out.close();

 

           } else {

              deskey = (SecretKey) new ObjectInputStream(

                     readFile(inputfilename + ".key")).readObject();

           }

           cip = Cipher.getInstance(Algorithm);

           cip.init(MODE, deskey);

       } catch (Exception e) {

           e.printStackTrace();

       }

 

    }

 

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值