zoukankan      html  css  js  c++  java
  • java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 
       DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致 的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的 Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。 
      通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

     

    下面是具体代码:(切记切记 字符串转字节或字节转字符串时 一定要加上编码,否则可能出现乱码)

      1 import java.io.IOException;
      2 import java.security.SecureRandom;
      3 
      4 import javax.crypto.Cipher;
      5 import javax.crypto.SecretKey;
      6 import javax.crypto.SecretKeyFactory;
      7 import javax.crypto.spec.DESKeySpec;
      8 
      9 import sun.misc.BASE64Decoder;
     10 import sun.misc.BASE64Encoder;
     11 
     12 /**
     13  * DES加密 解密算法
     14  * 
     15  * @author lifq
     16  * @date 2015-3-17 上午10:12:11
     17  */
     18 public class DesUtil {
     19 
     20     private final static String DES = "DES";
     21     private final static String ENCODE = "GBK";
     22     private final static String defaultKey = "test1234";
     23 
     24     public static void main(String[] args) throws Exception {
     25         String data = "测试ss";
     26         // System.err.println(encrypt(data, key));
     27         // System.err.println(decrypt(encrypt(data, key), key));
     28         System.out.println(encrypt(data));
     29         System.out.println(decrypt(encrypt(data)));
     30 
     31     }
     32 
     33     /**
     34      * 使用 默认key 加密
     35      * 
     36      * @return String
     37      * @author lifq
     38      * @date 2015-3-17 下午02:46:43
     39      */
     40     public static String encrypt(String data) throws Exception {
     41         byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));
     42         String strs = new BASE64Encoder().encode(bt);
     43         return strs;
     44     }
     45 
     46     /**
     47      * 使用 默认key 解密
     48      * 
     49      * @return String
     50      * @author lifq
     51      * @date 2015-3-17 下午02:49:52
     52      */
     53     public static String decrypt(String data) throws IOException, Exception {
     54         if (data == null)
     55             return null;
     56         BASE64Decoder decoder = new BASE64Decoder();
     57         byte[] buf = decoder.decodeBuffer(data);
     58         byte[] bt = decrypt(buf, defaultKey.getBytes(ENCODE));
     59         return new String(bt, ENCODE);
     60     }
     61 
     62     /**
     63      * Description 根据键值进行加密
     64      * 
     65      * @param data
     66      * @param key
     67      *            加密键byte数组
     68      * @return
     69      * @throws Exception
     70      */
     71     public static String encrypt(String data, String key) throws Exception {
     72         byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));
     73         String strs = new BASE64Encoder().encode(bt);
     74         return strs;
     75     }
     76 
     77     /**
     78      * Description 根据键值进行解密
     79      * 
     80      * @param data
     81      * @param key
     82      *            加密键byte数组
     83      * @return
     84      * @throws IOException
     85      * @throws Exception
     86      */
     87     public static String decrypt(String data, String key) throws IOException,
     88             Exception {
     89         if (data == null)
     90             return null;
     91         BASE64Decoder decoder = new BASE64Decoder();
     92         byte[] buf = decoder.decodeBuffer(data);
     93         byte[] bt = decrypt(buf, key.getBytes(ENCODE));
     94         return new String(bt, ENCODE);
     95     }
     96 
     97     /**
     98      * Description 根据键值进行加密
     99      * 
    100      * @param data
    101      * @param key
    102      *            加密键byte数组
    103      * @return
    104      * @throws Exception
    105      */
    106     private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    107         // 生成一个可信任的随机数源
    108         SecureRandom sr = new SecureRandom();
    109 
    110         // 从原始密钥数据创建DESKeySpec对象
    111         DESKeySpec dks = new DESKeySpec(key);
    112 
    113         // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
    114         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
    115         SecretKey securekey = keyFactory.generateSecret(dks);
    116 
    117         // Cipher对象实际完成加密操作
    118         Cipher cipher = Cipher.getInstance(DES);
    119 
    120         // 用密钥初始化Cipher对象
    121         cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
    122 
    123         return cipher.doFinal(data);
    124     }
    125 
    126     /**
    127      * Description 根据键值进行解密
    128      * 
    129      * @param data
    130      * @param key
    131      *            加密键byte数组
    132      * @return
    133      * @throws Exception
    134      */
    135     private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    136         // 生成一个可信任的随机数源
    137         SecureRandom sr = new SecureRandom();
    138 
    139         // 从原始密钥数据创建DESKeySpec对象
    140         DESKeySpec dks = new DESKeySpec(key);
    141 
    142         // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
    143         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
    144         SecretKey securekey = keyFactory.generateSecret(dks);
    145 
    146         // Cipher对象实际完成解密操作
    147         Cipher cipher = Cipher.getInstance(DES);
    148 
    149         // 用密钥初始化Cipher对象
    150         cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
    151 
    152         return cipher.doFinal(data);
    153     }
    154 }
  • 相关阅读:
    (干货).NET开发丰富的公共类库助你事半功倍(供下载免费使用)
    .NET+模块编排+数据库操作类的封装+分层架构+实体类+Ajax.net+Athem.NET+javascript+Activex组件+用户权限等
    IOS条形码扫描
    企业架构研究总结(2)——问题的由来和基本概念(转载)
    企业架构研究总结(1)——参考资料列表(转载)
    理解.NET中的异常(一)
    [转]《Java Generics and Collections》读书笔记三:协变式覆盖与泛型重载
    [转]《Java Generics and Collections》读书笔记二:子类化与通配符
    转:C++单例模式
    [转] java package import
  • 原文地址:https://www.cnblogs.com/laojiao/p/9897716.html
Copyright © 2011-2022 走看看