欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对称加密算法-DES

程序员文章站 2024-03-14 10:44:22
...

前言

在日常开发中,我们经常会用到各种加密算法,这里来和大家一起看看对称算法中的DES。对称加密算法的特点是算法公开,计算量小,加密速度快,加密效率高,优势在于加解密的高速度和长**时的难**性,但是,对称加密算法的安全性依赖于**,泄露**就意味着任何人都可以对加密的密文进行**。因此**的保护对于加密信息是否安全至关重要。常见的对称加密算法包括DES算法、3DES算法、AES算法。下面是一个DES的demo。

DES例子

import java.io.IOException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

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

public class DesEncrypt {

    // DES加***key
    public static String key = "12345678";

   // DES加密
    public static String encryptDES(String plaintext) {
        try {
            SecureRandom random = new SecureRandom();
            // 创建一个DESKeySpec对象
            DESKeySpec desKey = new DESKeySpec(key.getBytes());
            // 创建一个密匙工厂
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 将DESKeySpec对象转换成SecretKey对象
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(cipher.ENCRYPT_MODE, securekey, random);
            // 加密生成密文byte数组
            byte[] cipherBytes = cipher.doFinal(plaintext.getBytes());
            // 将密文byte数组转化为16进制密文
            String ciphertext = byteToHex(cipherBytes);
            return ciphertext;
        } catch (Throwable e) {
            e.printStackTrace();
        }

        return null;
    }

    // DES解密
    public static String decryptDES(String ciphertext) {
        try {
            SecureRandom random = new SecureRandom();
            // 创建一个DESKeySpec对象
            DESKeySpec desKey = new DESKeySpec(key.getBytes());
            // 创建一个密匙工厂
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 将DESKeySpec对象转换成SecretKey对象
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成解密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(cipher.DECRYPT_MODE, securekey, random);
            // 将16进制密文转化为密文byte数组
            byte[] cipherBytes = hexToByte(ciphertext);
            // 真正开始解密操作
            String plaintext = new String(cipher.doFinal(cipherBytes));
            return plaintext;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }

    // 将byte转化为16进制
    public static String byteToHex(byte[] bs) {
        if (0 == bs.length) {
            return "";
        } else {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < bs.length; i++) {
                String s = Integer.toHexString(bs[i] & 0xFF);
                if (1 == s.length()) {
                    sb.append("0");
                }
                sb = sb.append(s.toUpperCase());
            }
            return sb.toString();
        }
    }

    // 将16进制转化为byte
    public static byte[] hexToByte(String ciphertext) {
        byte[] cipherBytes = ciphertext.getBytes();
        if ((cipherBytes.length % 2) != 0) {
            throw new IllegalArgumentException("长度不为偶数");
        } else {
            byte[] result = new byte[cipherBytes.length / 2];
            for (int i = 0; i < cipherBytes.length; i += 2) {
                String item = new String(cipherBytes, i, 2);
                result[i / 2] = (byte) Integer.parseInt(item, 16);
            }
            return result;
        }
    }
    

    public static void main(String[] args) {
        // 待加密内容
        String str = "爱琴孩的博客";
        String ciphertext = encryptDES(str);
        System.out.println("加密后:" + ciphertext);
        String plaintext = decryptDES(ciphertext);
        System.out.println("解密后:" + plaintext);
    }
}

上面的例子中对加密后的字节数组,转成16进制字符串。我们也可以对字节数组进行Base64编码处理,只需要调用下列方法

    //字节数组转成base64编码
    public static String byte2Base62(byte[] bytes) {
        BASE64Encoder base64Encoder=new BASE64Encoder();
        return base64Encoder.encode(bytes);
        
    }
    
    //base64字符串转成字节数组
    public static byte[] base642byte(String base64Str) throws IOException {
        BASE64Decoder base64Decoder =new BASE64Decoder();
        return base64Decoder.decodeBuffer(base64Str);
        
    }

演示效果如下

加密后:06B65B83FE389F9B1C095A61E3BD5D87C854D32FC0D83483
解密后:爱琴孩的博客

总结

DES加密算法在企业中使用需要注意,**长度不能过低。而且就算长度较长,随着计算机算力的提高,**也只是时间问题。如果涉及的东西安全性要求较高,最好不用DES。