java使用DES加密方式,实现对数据的加密解密

来源:互联网 发布:硬盘分区丢失数据恢复 编辑:程序博客网 时间:2024/06/18 12:40

全栈工程师开发手册 (作者:栾鹏)

java教程全解

java使用DES加密方式,实现对数据的加密解密。加密和解密中需要使用同一个秘钥

第一种方式,使用类型Key作为加密解密的共同秘钥。

测试代码

public static void main(String[] args)     {        try {            DESDemo des=new DESDemo();            des.generateKey();            byte[] data="Hello World!".getBytes();            byte[] data1=des.des_encrypt(data);  //加密            byte[] data2=des.des_dencrypt(data1);  //解密            String back=new String(data2);            System.out.println(back);        } catch (Exception e) {            e.printStackTrace();        }    }

DES加密解密工具类的实现

package com.lp.app.safe;import java.security.*;import javax.crypto.*;public class DESDemo {    Key key;    //产生秘钥    public void generateKey() throws Exception {        // 得到DES私钥        KeyGenerator keyGen = KeyGenerator.getInstance("DES");        keyGen.init(56);        key = keyGen.generateKey();    }    //des加密,输入明文字节流    public byte[] des_encrypt(byte[] plainText) throws Exception {        // 得到DES cipher 对象        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");        // 使用密钥对明文进行加密        cipher.init(Cipher.ENCRYPT_MODE, key);        byte[] cipherText = cipher.doFinal(plainText);        return cipherText;    }    //des解密    public byte[] des_dencrypt(byte[] cipherText) throws Exception {        // 使用同一把密钥对密文进行解密        // 得到DES cipher 对象        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");        cipher.init(Cipher.DECRYPT_MODE, key);        byte[] newPlainText = cipher.doFinal(cipherText);        return newPlainText;    }}

第二种方式,使用字节数组byte[]作为加密解密的共同秘钥

测试代码

 public static void main(String[] args) {        String str1="12014-11-15";         // DES数据加密          String s1=encryptBasedDes(str1);        System.out.println("加密后"+s1);          // DES数据解密          String s2=decryptBasedDes(s1);          System.out.println("解密后"+s2);      }

加密解密工具类的实现

package com.lp.app.util;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;public class DESUtil {    //算法密匙    private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };      //数据加密,算法(DES)      public static String encryptBasedDes(String data) {          String encryptedData = null;          try {              // DES算法要求有一个可信任的随机数源              SecureRandom sr = new SecureRandom();              DESKeySpec deskey = new DESKeySpec(DES_KEY);              // 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象              SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");              SecretKey key = keyFactory.generateSecret(deskey);              // 加密对象              Cipher cipher = Cipher.getInstance("DES");              cipher.init(Cipher.ENCRYPT_MODE, key, sr);              // 加密,并把字节数组编码成字符串              encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));          } catch (Exception e) {  //            log.error("加密错误,错误信息:", e);              throw new RuntimeException("加密错误,错误信息:", e);          }          return encryptedData;      }      //解密(DES)      public static String decryptBasedDes(String cryptData) {          String decryptedData = null;        try {              // DES算法要求有一个可信任的随机数源              SecureRandom sr = new SecureRandom();              DESKeySpec deskey = new DESKeySpec(DES_KEY);              // 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象              SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");              SecretKey key = keyFactory.generateSecret(deskey);              // 解密对象              Cipher cipher = Cipher.getInstance("DES");              cipher.init(Cipher.DECRYPT_MODE, key, sr);              // 把字符串解码为字节数组,并解密              decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));          } catch (Exception e) {  //            log.error("解密错误,错误信息:", e);              throw new RuntimeException("解密错误,错误信息:", e);          }          return decryptedData;      }  }