基于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,如果有其他需求可以通过进一步封装达到自身需求

相关推荐
码农飞哥2 分钟前
互联网大厂Java求职面试实战:Spring Boot到微服务的技术问答解析
java·spring boot·缓存·面试·消息队列·技术栈·microservices
CodeCraft Studio5 分钟前
国产化Word处理控件Spire.Doc教程:通过C# 删除 Word 文档中的超链接
开发语言·c#·word
martian66518 分钟前
麒麟系统下Tomcat部署Java Web程序(WAR包)及全链路问题排查指南
开发语言·tomcat·系统安全
ai.Neo18 分钟前
牛客网NC22012:判断闰年问题详解
开发语言·c++·算法
曼岛_24 分钟前
[Java实战]Spring Boot + Netty 实现 TCP 长连接客户端及 RESTful 请求转发(二十六)
java·spring boot·tcp/ip
好吃的肘子25 分钟前
ElasticSearch进阶
大数据·开发语言·分布式·算法·elasticsearch·kafka·jenkins
老友@29 分钟前
Spring Data Elasticsearch 中 ElasticsearchOperations 构建查询条件的详解
java·后端·spring·elasticsearch·operations
NaclarbCSDN30 分钟前
Java集合框架
java·开发语言·前端
xiaohanbao0935 分钟前
day26 Python 自定义函数
开发语言·python·学习·机器学习·信息可视化·numpy
jie1889457586637 分钟前
c++,windows,多线程编程详细介绍
开发语言·c++