基于Cipher的Java加密工具类

一、什么是Cipher

Cipher是一种用于加密和解密信息的算法或方法。它将原始的明文转化为密文,从而保护信息的安全性和机密性。使用密码学中的数学原理和技术,Cipher可以对数据进行加密处理,使其在传输或存储过程中对未授权的访问者不可读。在必要时,只有具有正确密钥或密码的人才能解密并获取原始的明文信息。

Cipher可以分为对称加密和非对称加密两种类型。对称加密使用相同的密钥进行加密和解密,速度较快,但密钥管理较为复杂。而非对称加密使用一对密钥,私钥用于解密,公钥用于加密,在安全性上更加可靠,但运算速度较慢。

实际应用中,Cipher被广泛应用于保护敏感数据的传输,如网上银行、电子商务、密码学通信等领域。通过使用Cipher,可以保护个人隐私、防止信息被窃取或篡改,提高数据的安全性和机密性。

二、Java中的Cipher类

在Java中,Cipher是一个提供加密和解密功能的类。它位于javax.crypto包下,用于实现各种加密算法。Cipher类可以用于对数据进行加密和解密操作,同时还可以进行数字签名和验签。

代码示例:

java 复制代码
package com.blockchain.qgy.demo.cipherdemo;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.util.Arrays;
import java.util.Random;

public class CipherDemo {
    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        //密钥
        StringBuilder sb = new StringBuilder("QGY");
        while(sb.length() < 8) {
            sb.append((char)new Random().nextInt(128));
        }
        byte[] keyBytes = sb.toString().getBytes();
        //生成密钥
        SecretKey key = new SecretKeySpec(keyBytes,"DES");
        System.out.println("密钥:"+key);
        Cipher instance = Cipher.getInstance("DES");
        System.out.println("初始化Cipher对象");
        instance.init(Cipher.ENCRYPT_MODE,key);
        System.out.println("Cipher对象:"+instance);
        Provider provider = instance.getProvider();
        System.out.println("Cipher对象提供者:"+provider);
        String algorithm = instance.getAlgorithm();
        System.out.println("Cipher对象的算法名称:"+algorithm);
        int blockSize = instance.getBlockSize();
        System.out.println("返回块的大小:"+blockSize);
        byte[] iv = instance.getIV();
        System.out.println("返回新缓冲区的初始化向量:"+iv);
        AlgorithmParameters parameters = instance.getParameters();
        System.out.println("返回Cipher使用的参数:"+parameters);
        ExemptionMechanism exemptionMechanism = instance.getExemptionMechanism();
        System.out.println("Cipher使用的豁免机制对象:"+exemptionMechanism);
        byte[] bytes = instance.doFinal(new byte[]{'Q', 'G', 'Y'});
        System.out.println("bytes:"+Arrays.toString(bytes));
        System.out.println("bytes->update:"+Arrays.toString(instance.update(bytes)));
    }
}

上面是一个Cipher类加密的简单示例,在Cipher类中常用的常量字段有7个:

  1. public static final int ENCRYPT MODE:用于将 Cipher 初始化为加密模式的常量。
  2. public static final int DECRYPT MODE:用于将 Cipher 初始化为解密模式的常量。
  3. public static fnal int WRAP MODE:用于将 Cipher 初始化为密钥包装模式的常量。
  4. public static finalint UNWRAP MODE:用于将 Cipher 初始化为密钥解包模式的常量。
  5. public static final int PUBLIC KEY:用于表示要解包的密钥为"公钥"的常量。
  6. public static final int PRIVATE KEY:用于表示要解包的密钥为"私钥"的常量。
  7. public static final intSECRET KEY:用于表示要解包的密钥为"秘密密钥"的常量。

三、封装好的加密工具类

加密工具类:

java 复制代码
package com.blockchain.qgy.util;

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

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

/**
 * 基于Cipher实现的加密和解密工具类
 *
 * @author QGY
 *
 */
public class DeEnCoderCipherUtil {
    //加密、解密模式,即加密算法名称
    private final static String CIPHER_MODE = "DES";

    //DES密钥
    private static String DEFAULT_DES_KEY = "主播主播,你的MD5加密确实很强,但还是太吃操作了,有没有更加简单和强势的加密工具推荐一下,有的兄弟,有的,这就是当前版本T0.5的强势加密算法";

    /**
     * 不允许创建对象
     */
    private DeEnCoderCipherUtil(){

    }

    /**
     * function 字符串加密方法
     *
     * @param plaintext:要加密的字符串
     * @param key:密钥
     * @return 加密后的字符串
     */
    public static String getCipherText(String plaintext,String key){
        //判断入参是否正确
        if(Strings.isNullOrEmpty(plaintext) || Strings.isNullOrEmpty(key)) return null;

        try{
            byte[] cipherText = getCipherText(plaintext.getBytes(), key.getBytes());
            return new BASE64Encoder().encode(cipherText);
        } catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }

    /**
     * function 字节加密方法
     *
     * @param plaintext:要加密的字节
     * @param key:密钥
     * @return 加密后的字节
     */
    private static byte[] getCipherText(byte[] plaintext,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //1.生成随机数
        SecureRandom random = new SecureRandom();

        //2.基于密钥数据创建DESKeySpec对象
        DESKeySpec desKeySpec = new DESKeySpec(key);

        //3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        //4.Cipher对象进行加密
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);

        //5.初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);

        //返回密文
        return cipher.doFinal(plaintext);
    }

    public static String getPlainText(String cipherText,String key){
        //判断入参
        if(Strings.isNullOrEmpty(cipherText) ||  Strings.isNullOrEmpty(key)) return null;

        try{
            BASE64Decoder decoder = new BASE64Decoder();
            return new String(getPlainText(decoder.decodeBuffer(cipherText),key.getBytes()));
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] getPlainText(byte[] cipherText,byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
        //1.生成随机数
        SecureRandom random = new SecureRandom();

        //2.基于密钥数据创建DESKeySpec对象
        DESKeySpec desKeySpec = new DESKeySpec(key);

        //3.创建密钥工厂,将DESKeySpec转换成SecretKey对象来保存对称密钥
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(CIPHER_MODE);
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

        //4.Cipher对象进行解密
        Cipher cipher = Cipher.getInstance(CIPHER_MODE);

        //5.初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE,secretKey,random);

        //返回明文
        return cipher.doFinal(cipherText);
    }
}

strings工具类:

java 复制代码
package com.blockchain.qgy.util;

import java.util.Objects;

/**
 * 字符串工具类
 *
 * @author QGY
 *
 */
public class Strings {

    /**
     * 判断字符串是否为空或null
     *
     * @param string
     * @return 布尔值
     */
    public static Boolean isNullOrEmpty(String string){
        if (Objects.isNull(string)) return true;
        if (string.isEmpty()) return true;
        return false;
    }
}

注意:这里密钥的长度为8,如果有其他需求可以通过进一步封装达到自身需求

相关推荐
凤城老人29 分钟前
C++使用拉玛努金公式计算π的值
开发语言·c++·算法
失散132 小时前
分布式专题——10.4 ShardingSphere-Proxy服务端分库分表
java·分布式·架构·shardingsphere·分库分表
HAH-HAH3 小时前
【Python 入门】(2)Python 语言基础(变量)
开发语言·python·学习·青少年编程·个人开发·变量·python 语法
Bellafu6663 小时前
spring项目部署后为什么会生成 logback-spring.xml文件
java
递归不收敛3 小时前
一、Java 基础入门:从 0 到 1 认识 Java(详细笔记)
java·开发语言·笔记
沐浴露z4 小时前
【Java SpringAI智能体开发学习 | 2】SpringAI 实用特性:自定义Advisor,结构化输出,对话记忆持久化,prompt模板,多模态
java·spring·springai
小沈同学呀4 小时前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
码农小伙4 小时前
通俗易懂地讲解JAVA的BIO、NIO、AIO
java·nio
zhangfeng11334 小时前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息
不要再敲了5 小时前
JDBC从入门到面试:全面掌握Java数据库连接技术
java·数据库·面试