DES加密

数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用DEA。它出自IBM的研究工作,IBM也曾对它拥有几年的专利权,但是在1983年已到期后,处于公有范围中,允许在特定条件下可以免除专利使用费而使用。1977年被美国政府正式采纳。
----------------------------------------------------------
DES的原始思想可以参照二战德国的恩格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。
--加密原理---
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。
----------------------------------------------------------
package cn.oa.tools;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESUtil {
    private Key key ;

    public DESUtil() {

    }

    public DESUtil(String str) {
       setKey(str); // 生成密匙
    }

    public Key getKey() {
       return key ;
    }

    public void setKey(Key key) {
       this . key = key;
    }

    /**
      * 根据参数生成 KEY
      */
    public void setKey(String strKey) {
       try {
           KeyGenerator _generator = KeyGenerator.getInstance ( "DES" );
           _generator.init( new SecureRandom(strKey.getBytes()));
           this . key = _generator.generateKey();
           _generator = null ;
       } catch (Exception e) {
           throw new RuntimeException(
                  "Error initializing SqlMap class. Cause: " + e);
       }
    }

    /**
      * 加密 String 明文输入 ,String 密文输出
      */
    public String encryptStr(String strMing) {
       byte [] byteMi = null ;
       byte [] byteMing = null ;
       String strMi = "" ;
       BASE64Encoder base64en = new BASE64Encoder();
       try {
           byteMing = strMing.getBytes( "UTF8" );
           byteMi = this .encryptByte(byteMing);
           strMi = base64en.encode(byteMi);
       } catch (Exception e) {
           throw new RuntimeException(
                  "Error initializing SqlMap class. Cause: " + e);
       } finally {
           base64en = null ;
           byteMing = null ;
           byteMi = null ;
       }
       return strMi;
    }

    /**
      * 解密 以 String 密文输入 ,String 明文输出
      *
      * @param strMi
      * @return
      */
    public String decryptStr(String strMi) {
       BASE64Decoder base64De = new BASE64Decoder();
       byte [] byteMing = null ;
       byte [] byteMi = null ;
       String strMing = "" ;
       try {
           byteMi = base64De.decodeBuffer(strMi);
           byteMing = this .decryptByte(byteMi);
           strMing = new String(byteMing, "UTF8" );
       } catch (Exception e) {
           throw new RuntimeException(
                  "Error initializing SqlMap class. Cause: " + e);
       } finally {
           base64De = null ;
           byteMing = null ;
           byteMi = null ;
       }
       return strMing;
    }

    /**
      * 加密以 byte[] 明文输入 ,byte[] 密文输出
      *
      * @param byteS
      * @return
      */
    private byte [] encryptByte( byte [] byteS) {
       byte [] byteFina = null ;
       Cipher cipher;
       try {
           cipher = Cipher.getInstance ( "DES" );
           cipher.init(Cipher. ENCRYPT_MODE , key );
           byteFina = cipher.doFinal(byteS);
       } catch (Exception e) {
           throw new RuntimeException(
                  "Error initializing SqlMap class. Cause: " + e);
       } finally {
           cipher = null ;
       }
       return byteFina;
    }

    /**
      * 解密以 byte[] 密文输入 , 以 byte[] 明文输出
      *
      * @param byteD
      * @return
      */
    private byte [] decryptByte( byte [] byteD) {
       Cipher cipher;
       byte [] byteFina = null ;
       try {
           cipher = Cipher.getInstance ( "DES" );
           cipher.init(Cipher. DECRYPT_MODE , key );
           byteFina = cipher.doFinal(byteD);
       } catch (Exception e) {
           throw new RuntimeException(
                  "Error initializing SqlMap class. Cause: " + e);
       } finally {
           cipher = null ;
       }
       return byteFina;
    }

    /**
      * 文件 file 进行加密并保存目标文件 destFile 中
      *
      * @param file
      *             要加密的文件 如 c:/test/srcFile.txt
      * @param destFile
      *             加密后存放的文件名 如 c:/ 加密后文件 .txt
      */
    public void encryptFile(String file, String destFile) throws Exception {
       Cipher cipher = Cipher.getInstance ( "DES" );
       // cipher.init(Cipher.ENCRYPT_MODE, getKey());
       cipher.init(Cipher. ENCRYPT_MODE , this . key );
       InputStream is = new FileInputStream(file);
       OutputStream out = new FileOutputStream(destFile);
       CipherInputStream cis = new CipherInputStream(is, cipher);
       byte [] buffer = new byte [1024];
       int r;
       while ((r = cis.read(buffer)) > 0) {
           out.write(buffer, 0, r);
       }
       cis.close();
       is.close();
       out.close();
    }

    /**
      * 文件采用 DES 算法解密文件
      *
      * @param file
      *             已加密的文件 如 c:/ 加密后文件 .txt *
      * @param destFile
      *             解密后存放的文件名 如 c:/ test/ 解密后文件 .txt
      */
    public void decryptFile(String file, String dest) throws Exception {
       Cipher cipher = Cipher.getInstance ( "DES" );
       cipher.init(Cipher. DECRYPT_MODE , this . key );
       InputStream is = new FileInputStream(file);
       OutputStream out = new FileOutputStream(dest);
       CipherOutputStream cos = new CipherOutputStream(out, cipher);
       byte [] buffer = new byte [1024];
       int r;
       while ((r = is.read(buffer)) >= 0) {
           cos.write(buffer, 0, r);
       }
       cos.close();
       out.close();
       is.close();
    }

    public static void main(String[] args) throws Exception {
       DESUtil des = new DESUtil( "1234567" );
       // DES 加密文件
       // des.encryptFile("G:/test.doc", "G:/ 加密 test.doc");
       // DES 解密文件
       // des.decryptFile("G:/ 加密 test.doc", "G:/ 解密 test.doc");
       String str1 = " 要加密的字符串 test" ;
       // DES 加密字符串
       String str2 = des.encryptStr(str1);
       // DES 解密字符串
       String deStr = des.decryptStr(str2);
       System. out .println( " 加密前: " + str1);
       System. out .println( " 加密后: " + str2);
       System. out .println( " 解密后: " + deStr);
    }
}

你可能感兴趣的:(des)