• JAVA加解密之DES


    DES加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法。DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES加密算法加密的密文数据。因此,破译DES加密算法实际上就是搜索密钥的编码。对于56位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为2的56次方。

    使用测试类

    package com.test.cms.des;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    import javax.crypto.*;
    import javax.crypto.spec.DESKeySpec;
    import java.io.IOException;
    import java.security.SecureRandom;
    
    public class test {
    
        private final static String DES = "DES";
    
        public static void main(String[] args) {
            //原文
            String data = "yvioo";
    
            /**
             * 秘钥设置的长度必须大于等于8
             * 但是如果大于8的话,只会取前8个字节作为秘钥
             */
            String key = "wa1234535";
            //加密
            System.err.println(encrypt(data, key));
    
            //解密
            System.err.println(decrypt(encrypt(data, key), key));
    
        }
    
        /**
         * 根据键值进行加密
         * @param data
         * @param key  加密键byte数组
         * @return
         */
        public static String encrypt(String data, String key) {
            byte[] bt = encrypt(data.getBytes(), key.getBytes());
            String strs = new BASE64Encoder().encode(bt);
            return strs;
        }
    
        /**
         * 根据键值进行解密
         * @param data
         * @param key  加密键byte数组
         * @return
         */
        public static String decrypt(String data, String key) {
            try {
                if (data == null)
                    return null;
                BASE64Decoder decoder = new BASE64Decoder();
                byte[] buf = decoder.decodeBuffer(data);
                byte[] bt = decrypt(buf, key.getBytes());
                return new String(bt);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         *根据键值进行加密
         * @param data
         * @param key  加密键byte数组
         * @return
         */
        private static byte[] encrypt(byte[] data, byte[] key)  {
            try {
                // 生成一个可信任的随机数源
                SecureRandom sr = new SecureRandom();
    
                // 从原始密钥数据创建DESKeySpec对象
                DESKeySpec dks = new DESKeySpec(key);
    
                // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
                SecretKey securekey = keyFactory.generateSecret(dks);
    
                // Cipher对象实际完成加密操作
                Cipher cipher = Cipher.getInstance(DES);
    
                // 用密钥初始化Cipher对象
                cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
    
                return cipher.doFinal(data);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
        /**
         * 根据键值进行解密
         * @param data
         * @param key  加密键byte数组
         * @return
         */
        private static byte[] decrypt(byte[] data, byte[] key)  {
            try {
                // 生成一个可信任的随机数源
                SecureRandom sr = new SecureRandom();
    
                // 从原始密钥数据创建DESKeySpec对象
                DESKeySpec dks = new DESKeySpec(key);
    
                // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
                SecretKey securekey = keyFactory.generateSecret(dks);
    
                // Cipher对象实际完成解密操作
                Cipher cipher = Cipher.getInstance(DES);
    
                // 用密钥初始化Cipher对象
                cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
    
                return cipher.doFinal(data);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
  • 相关阅读:
    面试题:区分List中remove(int index)和remove(Object obj)
    Collection的子接口之一:List 接口
    面试题:ArrayList、LinkedList、Vector三者的异同?
    jdk 5.0 新增的foreach循环(用于遍历集合、数组)
    Iterator迭代器接口(遍历Collection的两种方式之一)
    哈希值
    Collection接口方法
    集合框架的概述
    注解(Annotation)
    System类、Math类、BigInteger与BigDecimal的使用
  • 原文地址:https://www.cnblogs.com/pxblog/p/13813117.html
Copyright © 2020-2023  润新知