Java代码实现DES算法加密解密功能

一、概述
DES加密算法是一种对称加密,所谓对称加密就是加密和解密都是用同一把密钥。
在这里插入图片描述
二、详细代码

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Test3 {
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, BadPaddingException, InvalidKeyException, IllegalBlockSizeException {

        /*
        * 1.明文
        * 2.提供原始密钥:长度64位,8个字节
        *
        * 加密算法:就是通过对比特位进行一些数学运算
        * */
        String clearText = "一直在努力的笨鸟";//明文
        String originKey = "他长的是真鸡儿帅啊";//原始密钥
        
        String cipherText = desEncript(clearText,originKey);//明文-->密文
        System.out.println("明文: " + clearText);
        System.out.println("明文-->密文: " + cipherText);

        String cipherText2 = desDecript(cipherText,originKey);//密文-->明文
        System.out.println("密文-->明文: " + cipherText2);
    }


    /**
     * 用DES算法进行加密
     * @param clearText
     * @param originKey
     * @return
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    private static String desEncript(String clearText, String originKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //1.获取加密算法工具类对象  参数:转换的名称,例如 DES/CBC/PKCS5Padding。
        Cipher cipher = Cipher.getInstance("DES");

        /*
        * 2.
        *   public final void init(int opmode,Certificate certificate) throws InvalidKeyException
        *   对工具类对象进行初始化
        *
        * 参数 opmode:加密/解密模式
        *               DECRYPT_MODE 用于将 Cipher 初始化为  解密  模式的常量。
        *               ENCRYPT_MODE 用于将 Cipher 初始化为  加密  模式的常量。
        * 参数 certificate:对原始密钥处理之后的密钥
        *
        * 注意:加密解密模式要选对,我当时写加密的时候选了DECRYPT_MODE,报了一个这个错
        *      Input length must be multiple of 8 when decrypting with padded cipher
        *      莫名其妙,研究好久才发现。
        * */
        SecretKeySpec key = getKey(originKey);
        cipher.init(Cipher.ENCRYPT_MODE,key);
        //3.用加密工具类对象对明文进行加密-->密文
        byte[] doFinal = cipher.doFinal(clearText.getBytes());

        //密文转换成base64编码,解决密文乱码问题
        byte[] encode = Base64.getEncoder().encode(doFinal);
        return new String(encode);
    }

    /**
     * 不论原始密钥originKey多长,我们都要醒程一个8个字节的原始密钥
     * @param originKey
     * @return
     */
    private static SecretKeySpec getKey(String originKey) {
        //byte数组每个元素默认初始值位0
        byte[] buffer = new byte[8];
        //获取用户提供的原始密钥字节数组
        byte[] originKeyBytes = originKey.getBytes();
        //如果originKeyBytes.length > 8,只要8个字节,如果没有超过8个字节,就用默认初始值来填充
        for (int i = 0; i < 8 && i < originKeyBytes.length; i++) {
            buffer[i] = originKeyBytes[i];
        }
        /*
        * public SecretKeySpec(byte[] key, String algorithm)  根据给定的字节数组构造一个密钥
        * 参数 key:密钥的密钥内容。
        * 参数 algorithm:与给定的密钥内容相关联的密钥算法的名称。
        * */
        SecretKeySpec key = new SecretKeySpec(buffer, "DES");
        return key;
    }

    /**
     * 用DES算法进行解密
     * @param cipherText
     * @param originKey
     * @return
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    private static String desDecript(String cipherText, String originKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        Cipher cipher = Cipher.getInstance("DES");
        SecretKeySpec key = getKey(originKey);
        cipher.init(Cipher.DECRYPT_MODE,key);
        //注意:因为密文是用Base64转换后的,所以在doFinal以前要用Base64转一下
        byte[] decode = Base64.getDecoder().decode(cipherText);
        byte[] doFinal = cipher.doFinal(decode);
        return new String(doFinal);
    }

}

三、执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值