第五章 基于java的加密解密 学习笔记(五)DES加密

基于java的加密解密的文章目录

第一章 基于java的加密解密 学习笔记(一) 常见加密算法的简单介绍
第二章 基于java的加密解密 学习笔记(二)哈希算法
第三章 基于java的加密解密 学习笔记(三)Base64
第四章 基于java的加密解密 学习笔记(四)AES加密
第五章 基于java的加密解密 学习笔记(五)DES加密
第六章 基于java的加密解密 学习笔记(六)RSA加密



前言

上一章中,我们介绍AES密码算法在java中使用,本章,我们介绍DES。

一、DES简介?

基本原理
DES算法是属于对称密码算法中的分组加密算法。
分组加密属于块加密,对一个字节块进行加密。与分组加密对应的是流加密,流加密指一个字节一个字节加密。
密钥长64bit,56bit参与运算,其余8bit为校验位。分别取自{8, 16, 24, 32, 40, 48, 56, 64}位。
当n个64bit明文数据块都经过DES加密处理后,所得到的n个64bit密文数据块串在一起就是密文。

加密过程
以论运算为主,共进行16次轮加密。每一次轮加密左边与f运算的R异或后变右边,右边变左边。
IP置换(Initial Permutations)
将原来的64bit二进制位重新排序
轮函数——E扩展置换
将32bit输入扩展为48bit输出

密钥生成
64bit密钥生成16个48bit的轮密钥
使用PC1置换算法,64bit->56bit
分组循环左移(若求解密密钥则是分组循环右移)
合并后使用PC2置换算法,56bit->48bit。

二、实例

1.DES工具类

代码如下(示例):


import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.util.Base64;

/**
 * DES 加密解密
 *
 * @Auther: BeinLai
 * @Date: 2023/09/04/10:52
 * @Description:
 * DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥。
 */

public class DESUtils {

    /**
     * 偏移变量,固定占8位字节
     */
    private final static String IV_PARAMETER = "12345678";


    // 默认编码
    private static String CHARSET="utf-8";

    // 密钥算法
    private static String ALGORITHM ="DES";

    /**
     * 加密/解密  算法-工作模式-填充模式
     */
    private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";



    /**
     * 生成key
     */
    private static Key generateKey(String password) throws Exception{
        DESKeySpec desKeySpec=new DESKeySpec(password.getBytes(CHARSET));
        SecretKeyFactory secretKeyFactory=SecretKeyFactory.getInstance(ALGORITHM);
        Key key=secretKeyFactory.generateSecret(desKeySpec);
        return key;
    }

    /**
     * 加密 字符串
     */
    public static String encrypt(String password,String data){
        if(password==null || password.length()<8){
            throw new RuntimeException("加密失败,key不能小于8位");
        }
        if(data==null){
            return null;
        }
        try{
            Key key=generateKey(password);
            Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));

            cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);
            byte[] bytes= cipher.doFinal(data.getBytes(CHARSET));
            String str=new String(Base64.getEncoder().encode(bytes));
            return str;
        }catch (Exception e){
            e.printStackTrace();
            return data;
        }
    }

    /**
     * 解密 字符串
     */
    public static String decrypt(String password,String data){
        if(password==null || password.length()<8){
            throw new RuntimeException("加密失败,key不能小于8位");
        }
        if(data==null){
            return null;
        }
        try{
            Key key=generateKey((password));
            Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
            cipher.init(Cipher.DECRYPT_MODE,key,ivParameterSpec);
            byte[] bytes=Base64.getDecoder().decode(data.getBytes(CHARSET));
            String str=new String(cipher.doFinal(bytes),CHARSET);
            return str;

        }catch (Exception e){
            e.printStackTrace();
            return data;
        }
    }

    /**
     * 加密文件
     * srcile:待加密的文件路径
     * desFile:待解密的文件路径
     */
    public static String encryptFile(String password,String srcile,String desFile){
        if(password==null || password.length()<8){
            throw new RuntimeException("加密失败,key不能小于8位");
        }
        try{
            Key key=generateKey(password);
            IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
            Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);

            InputStream is=new FileInputStream(srcile);
            OutputStream os=new FileOutputStream(desFile);
            CipherInputStream cis=new CipherInputStream(is,cipher);
            byte[] buffer=new byte[1024];
            int r;

            while((r=cis.read(buffer))>0){
                os.write(buffer,0,r);
            }
            cis.close();
            is.close();
            os.close();
            return desFile;

        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 解密文件
     * srcFile:待解密的文件路径
     * ensFile:待加密的文件路径
     */
    public static String decryptFile(String password,String srcFile,String ensFile){
        if(password==null || password.length()<8){
            throw new RuntimeException("加密失败,key不能小于8位");
        }
        try{
            Key key=generateKey(password);
            IvParameterSpec ivParameterSpec=new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
            Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE,key,ivParameterSpec);

            InputStream ins=new FileInputStream(srcFile);
            OutputStream os=new FileOutputStream(ensFile);
            CipherOutputStream cos=new CipherOutputStream(os,cipher);
            byte[] buffer=new byte[1024];
            int r;
            while((r=ins.read(buffer))>0){
                cos.write(buffer,0,r);
            }
            cos.close();
            ins.close();
            os.close();
            return ensFile;


        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

2.测试

代码如下(示例):

public static void main(String[] args){
        String data = "hello,您好";
        String password="WfJTKO9S4eLkrPz2JKrAnzdb";
        System.out.println("原文:" + data);
        try {
            String s1 = DESUtils.encrypt(password,data);
            System.out.println("加密文:" + s1);

            System.out.println("=======分隔线==========");

            String s2=DESUtils.decrypt(password,s1);
            System.out.println("解密后:" + s2);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日生双翼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值